Neden bu PHP kodu) (mysql_query çağrı asmak nedir?

6 Cevap php

Ben hata alıyorum nerede bu PHP ile sorun yaşıyorum

Fatal error, 30 saniye uygulama süresi maksimum aşılmamıştır /var/www/vhosts/richmondcondo411.com/httpdocs/places.php çizgiye 77

Kod burada kilitleniyor:

function getLocationsFromTable($table){

    $query = "SELECT * FROM `$table`";
    if( ! $queryResult = mysql_query($query)) return null;

    return mysql_fetch_array($queryResult, MYSQL_ASSOC);

}

ve buradan (şimdiye kadar):

function hasCoordinates($houseNumber, $streetName){

    $query = "SELECT lat,lng FROM geocache WHERE House = '$houseNumber' AND StreetName = '$streetName'";
    $row = mysql_fetch_array(mysql_query($query), MYSQL_ASSOC);
    return ($row) ? true : false;

}

hem mysql_query () çağrısı ile hat üzerinde.

Ben sorunu yalıtmak için çalışırken ilk biriyle oynamaya oldum çünkü ben her kod parçacığı için farklı stiller kullanmak biliyorum, bu kadar.

The $table in the first example is 'school' which is a table which definitely exists. I just don't know why it sits there and waits to time out instead of throwing an error back at me.

Sitenin geri kalanından mysql sorguları düzgün çalışıyor. Eminim böyle bağlandı yapmaya çalıştık

//connection was opened like this:
//$GLOBALS['dbh']=mysql_connect ($db_host, $db_user, $db_pswd) or die ('I cannot connect to the database because: ' . mysql_error());

if( ! $GLOBALS['dbh']) return null;

ve bu ince geçmişte bunu yaptı. Herhangi bir fikir?

Update


Bu tablo boyutu değil. Ben sadece beş kayıtları alma denedim ve hala zaman aşımına uğradı. Ayrıca, bu hat ile:

$query = "SELECT lat,lng FROM geocache WHERE House = '$houseNumber' AND StreetName = '$streetName'";

yalnızca belirli bir rekor arıyor ve şimdi nereye takılacağını bu.

6 Cevap

Zaman mysql sorguları yürütme zaman doğru sayılmaz veri döndürmek için bekleyen geçirdi. See here.

Sorun kodu başka bir yerde büyük olasılıkla - Eğer suçlayarak fonksiyonları muhtemelen sonsuz döngüye denir. Eğer haklıysam görmek için mysql kodunu yorum deneyin.

MySQL geri PHP geçerli veri iletimi ile meşgul gibi geliyor, ama Apache maksimum yürütme süresini aşan için PHP sürecini kapanmadan önce işlemini bitirmek için zamanı olmadığını o kadar çok var.

Bu tablodan everything seçmek için gerçekten gerekli midir? Ne kadar veri? Var mı BLOB ya da belirli lag için hesap olur TEXT sütunlar?

Eğer gerçekten ihtiyacınız olanı seçilir ediliyor ve hangi analiz başlamak için iyi bir yer olurdu.

Kod zaman aşımı bağlanmaya çalışıyor mu ya da bağlamak ve sorgu asmak nedir?

Lütfen kodu aslında mysql_query çağrısının geçmişteki alırsa (o zaman aşımı için uzun süre beklemek zorunda olsa bile) o zaman ne belirlemek için mysql_error işlevini kullanabilirsiniz:

mysql_query("SELECT * FROM table");
echo mysql_errno($GLOBALS['dbh']) . ": " . mysql_error($GLOBALS['dbh']) . "\n";

MySQL error codes: Sonra hata ayrıntılı nedenini belirlemek için hata numarasını kullanabilirsiniz

Kodunuzu sorgu asılı ise, açıklayan ve bunu bir veri boyutu sorun olup olmadığını görmek için bir mysql komut satırı istemcisi sorguyu çalıştıran deneyebilirsiniz. Ayrıca tamamlamak ve neler olduğunu görmek için sorguyu izin maksimum yürütme süresini artırabilirsiniz:

ini_set('max_execution_time', 300); // Allow 5 minutes for execution

Ben tablonun boyutu hakkında biliyorum, ama LIMIT 10 kullanmayı deneyin ve hala kapatırsa görmüyorum.

Bu tablo bir sorguda almak için sadece büyük olduğunu olabilir.

Parametreler hasCoordinates için $ housenumber ve $ Sokak () zaten MySQL sorgu için temizlenmiş sürece (çok düşüktür) Eğer mysql_real_escape_string() (kasıtlı veya kasıtsız) sql enjeksiyonu önlemek için onları tedavi etmek gerekir. Mysql_real_escape_string () için düzgün çalışması için (örn. mysql_set_charset aracılığıyla charset değişti varsa) siz de işlevine MySQL bağlantı kaynak geçmelidir.

error reporting E_ALL ayarlanır ve web sunucusunun error.log bakmak yok (veya Açık display_erorrs = kurdunuz?)

Bu deneyin

function hasCoordinates($houseNumber, $streetName) {
  $houseNumber = mysql_real_escape_string($houseNumber);
  $streetName = mysql_real_escape_string($streetName);
  $query = "
    EXPLAIN SELECT
      lat,lng
    FROM
      geocache
    WHERE
      House='$houseNumber'
      AND StreetName='$streetName'
  ";
  $result = mysql_query($query) or die(mysql_error());
  while ( false!==($row=mysql_fetch_array($result, MYSQL_ASSOC)) ) {
    echo htmlspecialchars(join(' | ', $row)), "<br />\n";
  }
  die;
}

ve http://dev.mysql.com/doc/refman/5.0/en/using-explain.html çıkışını yorumlamak bakın.

Eğer 300 yürütme süresini artırdı ve hala o 300 saniye geçti ise-, ben tanımı gereği gidiyorsun sonsuz bir döngü gibi bir şey var diye düşünüyorum.

-Benim ilk şüpheli MySQL veri büyük setleri ile uğraşan için kullanılan beri php kodu, bu yüzden kesinlikle aslında söz (bir hata mesajı ya da bir şey ile sağ ona önce ölmek) olarak mysql sorgu ulaşan konum emin olur.

Eğer bu çalışırsa-, o zaman o, ya da bunu yapmazsanız bilinen iyi numaraları ile kod değiştirerek varsa bazı veritabanı GUI aracılığıyla veya veritabanına komut satırı erişimi üzerinden veritabanı üzerinde veri bilinen bu sorguyu çalıştıran aslında deneyin.

-Eğer sorgu kendi üzerinde çalışır VolkerK belirtildiği gibi, sonra ben, $ housenumber veya $ Sokak değişkenler ile gelen kazayla SQL enjeksiyonu için kontrol.