Senkronizasyon dışında komutları;

5 Cevap php

Ben mysqli'nin aracılığıyla iki MySQL sorgu çağırır benim PHP kodu çalıştırmak ve hata almaya çalışıyorum "senkronizasyon dışında Komutları, şimdi bu komutu çalıştıramazsınız".

İşte ben kullanıyorum kodudur

<?php
$con = mysqli_connect("localhost", "user", "password", "db");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". Mysqli_connect_error();
    exit;
}
$con->query("SET NAMES 'utf8'");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
    $rows = getRowsByArticleSearch("test", "Auctions", " ");
    $last = ceil($rowcount/$page_rows);
}  else {

print_r($con->error);
}
foreach ($rows as $row) {
    $pk = $row['ARTICLE_NO'];
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="deleterec(\'Layer2\', \'' . $pk . '\')">DELETE RECORD</a></td>' . "\n";
    echo '</tr>' . "\n";
}
function getRowsByArticleSearch($searchString, $table, $max) {
    $con = mysqli_connect("localhost", "user", "password", "db");
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
        $getRecords->bind_param("s", $searchString);
        $getRecords->execute();
        $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
        while ($getRecords->fetch()) {
            $result = $con->query($recordsQuery);
            $rows = array();
            while($row = $result->fetch_assoc()) {
                $rows[] = $row;
            }
            return $rows;
        }
    }
}

Ben bu kadar okuma denedim, ama ne yapacağımı emin değilim. Ben mağaza sonucu okudum ve onları kullanırken serbest sonuç, ancak bu fark yaptık. Ben tam olarak hangi nokta bu hata neden olan en emin değilim, ve neden ediliyor neden bilmek istiyorum, ve bunu nasıl düzeltebilirim.

CountQuery için döngü bile çünkü yakın yakın benim sql sözdizimi bir hata, girilen değilse, benim hata ayıklama ifadeleri, ilk gidiş '% ? %'. Ben sadece yerine LIKE şartında dayalı sınırlamaya çalışan * seçerseniz Ancak, ben yine de senkronizasyon hata dışında komut olsun.

5 Cevap

Mysqli varsayılan tamponsuz sorguları kullanır, çünkü iki eşzamanlı sorguları olamaz (hazırlanmış tablolar için, vanilya için tersi mysql_query). Bunu aracılığıyla bir dizi ve döngü içine ilkini getirme, ya da ( $stmt->store_result() kullanarak) sorguları tampon mysqli söyleyebilir ya.

Ayrıntılar için here bakın.

Benim C uygulamasında bu sorunu çözüldü - burada ben yaptım nasıl:

  1. Mysql forumlardan alıntı:

    Bu hata, sonuçlar ne zaman terminate your query with a semicolon delimiter inside the application. Bu komut satırından veya sorgu tarayıcıda çalıştırırken bir noktalı virgül sınırlayıcı bir sorgu sona erdirmek için gerekli iken, uygulama içerisinden sorgudan sınırlayıcı çıkarın.

  2. Benim sorgu çalıştıran ve sonuçları ile uğraşan sonra [C API: mysql_store_result()], böyle iki veya daha fazla seçme tablolara (geri uğraşmadan arkaya birden çok SQL deyimi yürütme yoluyla gerçekleşir başka potansiyel bekleyen sonuçlar üzerinde yineleme sonuçlar).

    Aslında benim işlemler birden fazla sonuç yok ama veritabanı bilmiyor olmasıdır Ben yürütmek kadar: [C API: mysql_next_result()]. Olmayan-sıfır dönene kadar ben (iyi ölçmek için) bir döngü içinde bunu. Geçerli bağlantı işleyicisi (I bağlantısı yükünü en aza indirmek için elimden işleyicileri önbelleğe) başka bir sorguyu yürütmek için tamam bilir o zaman.

    Bu kullandığım bir döngü:

    for(; mysql_next_result(mysql_handler) == 0;) 
      /* do nothing */;
    

Ben PHP bilmiyorum ama benzer bir şey var eminim.

Sorun çoğu MySQL API'leri üzerine inşa edilmiştir MySQL istemci C kütüphanesidir. Sorun C kütüphanesi eşzamanlı sorguları yürütülmesini, böylece de yok üstüne inşa tüm API'leri desteklemiyor olmasıdır. Eğer tamponsuz sorguları kullanmak bile. Bu uyumsuz MySQL API yazılmış bir nedeni de budur. Bu TCP ve tel protokolü does eşzamanlı sorguları destekleyen kullanarak MySQL sunucusu ile doğrudan iletişim kurar.

Sizin çözüm aynı anda devam hem de olması gerekir, ya da muhtemelen C kütüphanesinde kendi varlığı için asıl nedenlerinden biridir tamponlu sorguları, (diğer kullanmak için onları değiştirmek kalmaz algoritmasını değiştirmek için ya da bir ) imleç bir tür sağlar.

I use CodeIgniter. One server OK ... this one probably older ... Anyway using

$this->db->reconnect();

Düzelttim.

Ben sorun işlevinde yeni bir bağlantı yapmak, ve sonra sonunda onu kapanış değiliz olduğunu düşünüyorum. Neden varolan bağlantı geçen ve yeniden kullanmayı deneyin değil mi?

Bir başka olasılık da bir süre döngü getiriliyor ortasında dışarı dönen konum olmasıdır. Bunu dış getirme Tamamlanması asla.