Proč tento PHP kód pověsit na volání do mysql_query ()?

hlasů
3

Mám potíže s tímto PHP skript, kde jsem dostat chybu

Závažná chyba : Maximální doba realizace 30 sekund překročena /var/www/vhosts/richmondcondo411.com/httpdocs/places.php na řádku 77

Kód visí zde:

function getLocationsFromTable($table){

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

    return mysql_fetch_array($queryResult, MYSQL_ASSOC);

}

a zde (zatím):

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;

}

a to jak na lince s mysql_query () volání.

Vím, že mohu použít různé styly pro každou fragmentu kódu, je to proto, že jsem hrál s prvním snaží izolovat problém.

$tableV prvním příkladu je ‚škola‘, což je tabulka, která určitě existuje. Já prostě nevím, proč tam sedí a čeká, až vyprší časový limit, místo házení chyby na mě.

MySQL dotazů od zbytku stránky fungují správně. Snažil jsem se dělat jistý, že jsem byl připojen takhle

//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;

a to dělalo to v minulosti uvedené pokuty. Nějaké nápady?

Aktualizace


Není to o velikosti stolů. Snažil jsem se dostat pouze pět záznamů, a to ještě vypršel. Také se tento řádek:

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

že hledá pouze pro jeden konkrétní záznam, a to je místo, kde to teď visí.

Položena 27/08/2009 v 00:42
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
3

Vypadá to, že MySQL je zaneprázdněn přenosu platná data zpět do PHP, ale je tu tolik, že to tam není čas na dokončení procesu před Apache ukončí proces PHP za překročení maximální doby provedení.

Je to opravdu nutné vybrat vše z této tabulky? Kolik dat je to? Existují BLOBnebo TEXTsloupce, které by představovaly určité zpoždění?

Analyzovat, co byl vybrán a to, co opravdu potřebujete by bylo dobré místo pro start.

Odpovězeno 27/08/2009 v 00:45
zdroj uživatelem

hlasů
2

Čas strávený čekání na mysql dotazy vrátit data se nezapočítává do doby provedení. Naleznete zde.

Problém je s největší pravděpodobností někde jinde v kódu - všechny funkce, které obviňují se případně nazývá v nekonečné smyčce. Zkuste komentářů mimo mysql kód zjistit, jestli mám pravdu.

Odpovězeno 27/08/2009 v 04:31
zdroj uživatelem

hlasů
1

-Pokud zvýšil čas spuštění na 300, a to přesto, že prošla 300 sekund, myslím, že ze své podstaty máte něco jako nekonečné smyčce děje.

-můj první podezřelý by byl váš php kód, protože MySQL se používá pro práci s velkými soubory dat, takže určitě se ujistěte, že jste vlastně dosáhl dotaz mysql v otázce (umírají přímo před ním s chybovým hlášením, nebo tak něco).

-Pokud, že funguje, pokuste se ve skutečnosti spuštěn tento dotaz se známými údaji z databáze přes nějaké databáze GUI nebo prostřednictvím přístupu příkazového řádku do databáze, pokud máte to, nebo nahrazení kódu se známými dobrými čísly, pokud nemáte.

-Pokud dotaz pracuje na to vlastní, pak bych kontrolovat náhodné SQL injection pocházející ze s $ číslo domu nebo $ Ulice proměnných, jak je uvedeno VolkerK.

Odpovězeno 27/08/2009 v 15:36
zdroj uživatelem

hlasů
1

Pokud parametry $ číslo domu a $ Ulice pro hasCoordinates () jsou již dezinfikují na dotaz MySQL (velmi nepravděpodobné), je třeba s nimi zacházet s mysql_real_escape_string () , aby se zabránilo (vědomě nebo nevědomě) sql injekce. Pro mysql_real_escape_string () pracovat správně (například pokud jste změnili znakovou sadu pomocí mysql_set_charset ), měli byste také projít připojovací prostředek MySQL funkce.

Je hlášení chyb nastaven na E_ALL a se díváte na error.log na webový server (nebo nastavit display_erorrs = zapnuto)?

Zkuste to

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;
}

a odkazují na http://dev.mysql.com/doc/refman/5.0/en/using-explain.html interpretovat výstup.

Odpovězeno 27/08/2009 v 09:11
zdroj uživatelem

hlasů
1

Nevím o velikosti vašeho stolu, ale zkuste LIMIT 10a uvidíte, jestli stále visí.

Mohlo by se stát, že váš stůl je prostě příliš velká, aby přinesla v jednom dotazu.

Odpovězeno 27/08/2009 v 00:52
zdroj uživatelem

hlasů
1

Má vaše timeout kód pokouší připojit, nebo to propojit a pověsit na dotaz?

Pokud váš kód skutečně dostane kolem mysql_query hovoru (i když to musí dlouho čekat na timeout), pak můžete použít funkci mysql_error zjistit, co se stalo:

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

Potom můžete použít číslo chyby určit podrobný důvod chyby: MySQL chybové kódy

Pokud váš kód visí na dotaz, můžete zkusit popsat a spuštění dotazu v klientovi příkazového řádku mysql aby zjistil, jestli je to otázka velikosti dat. Můžete také zvýšit maximální doby provedení, aby dotaz dokončit a vidět, co se děje:

ini_set('max_execution_time', 300); // Allow 5 minutes for execution
Odpovězeno 27/08/2009 v 00:52
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more