Bir döngü içinde infaz, sorgu ilk yineleme sonra çıkmak için komut olur

2 Cevap php

Burada anlaşılmaz .... Bu kod:

$qry = sprintf("INSERT INTO news_sites_homepage_grab 
                VALUES ('', %d, '%s', NOW(), NOW())", 
                        $site_id, mysql_real_escape_string($html));

... $html her zaman değişen bir döngü içinde yürütülür. Bu kod bir kez çalıştırılır ama bir dahaki sefere, komut basitçe ölür. Hiçbir uyarı / hata, hiçbir şey. Çok uzun olabilir bu yüzden $html, bir web sayfasını gösteren bir dizedir. Ben 32M için PHP bellek limitini artırdı ve 16M ama hiçbir şey MySQL max_allowed_packet belirledik.

Herkes herhangi bir fikir var mı? Teşekkürler!

GÜNCELLEME: Burada bir döngü içinde denir işlevidir.

function save_html($site_id, $html) {
global $db;
try {
    $qry = sprintf("INSERT INTO site_grab VALUES ('', %d, '%s', NOW(), NOW())",
                   $site_id,
                   mysql_real_escape_string($html));

    $db->insert($qry);

}
catch(Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

return;
}

2 Cevap

Benim tavsiye Bu sorunu giderme vazgeçmek ve PDO geçmek olacaktır. Bu tekrarlanan sorgular için parametreler kullanmak ve çok daha fazla ölçülebilir zaman SQL enjeksiyon için savunmasız değildir ki, prepared statements destekler.

İşte $db PDO örneğini tutmaktadır varsayar sizin işlevinin basit üstlenmeden bulunuyor:

function save_html($site_id, $html) {
    global $db;
    static $insert = Null;
    if (isnull($insert)) {
        /* explicitly name the columns, in case you later add more to the table
           or change their order. I'm also guessing `id` is auto-incrementing,
           so I'm leaving it out.
         */
        $insert = $db->prepare("INSERT INTO site_grab (sid, site_text, date_added, date_modified) VALUES (?, ?, NOW(), NOW())");
    }
    try {
        $insert->execute(array($site_id, $html));
    } catch(Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    }

    return;
}

date_added ZAMAN yazın varsa, CURRENT_TIMESTAMP için varsayılan değeri ayarlamak ve ekin dışarı bırakabilirsiniz. Alternatif olarak, bir satır güncellemek zaman açıkça alanını ayarlamak gerek duymazsınız date_modified sütuna, bir ON UPDATE CURRENT_TIMESTAMP özelliğini ekleyin. Yerleştirme Eski yapmak, güncellenmesi daha yaygın olacak ise; aksi halde, ikincisi yok.

Ayrıca birden çok işlevleri erişilebilir konum yüzden bir nesne hazırlanmış ifadeleri depolamak ve hizmet belirleyicisinin çeşit ile küresel $db yerini alabilir (basit yolu statik bir işlevi veya bazı sınıf özelliğini kullanmak için) ya da ("Inversion of Control Containers and the Dependency Injection pattern" okunur) bağımlılık enjeksiyon kullanın.

Ben PDO ve hazırlanmış deyimleri kullanarak ancak mysql_real_escape_string için link tanımlayıcı () işlevi $ db eklemeyi deneyin soruyu cevaplamak (denemek için) preffer.

Bu yardımcı olur mu? Değilse, mysql_error () fonksiyonu çıkışını yankılanan deneyin.

Formating eksikliği için özür dilerim, ben mobil ATM değilim.