为什么这段PHP代码挂起对mysql_query()的调用?

为什么这段PHP代码挂起对mysql_query()的调用?,php,mysql,Php,Mysql,我遇到了这个PHP脚本的问题,我得到了错误 致命错误:在线77 代码挂在这里: function getLocationsFromTable($table){ $query = "SELECT * FROM `$table`"; if( ! $queryResult = mysql_query($query)) return null; return mysql_fetch_array($queryResult, MYSQL_ASSOC); } 这里(到目前为止)

我遇到了这个PHP脚本的问题,我得到了错误

致命错误:在线77

代码挂在这里:

function getLocationsFromTable($table){

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

    return mysql_fetch_array($queryResult, MYSQL_ASSOC);

}
这里(到目前为止):

两者都在mysql_query()调用的行上

我知道我对每个代码段使用不同的样式,这是因为我一直在使用第一个代码段来隔离问题

第一个示例中的
$table
是“school”,这是一个肯定存在的表。 我只是不知道为什么它坐在那里等待超时,而不是向我抛出错误

来自站点其余部分的mysql查询工作正常。我试着确保我是这样连接的

//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;
它通过了那次罚款。有什么想法吗

更新
这不是桌子的大小。我试着只得到五张唱片,但还是超时了。此外,这一行:

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

它只在寻找一条特定的记录,这就是它现在挂起的地方。

听起来MySQL正忙于将有效数据传输回PHP,但内容太多,以至于在Apache关闭PHP进程以超过其最大执行时间之前,没有时间完成该进程

是否确实需要从该表中选择所有内容?它有多少数据?是否有
BLOB
TEXT
列可以解释特定的延迟


分析所选内容和您真正需要的内容是一个很好的起点。

您的代码是在尝试连接时超时,还是连接并挂起查询

如果您的代码实际上通过了mysql\u查询调用(即使它必须等待很长时间才能超时),那么您可以使用mysql\u error函数来确定发生了什么:

mysql_query("SELECT * FROM table");
echo mysql_errno($GLOBALS['dbh']) . ": " . mysql_error($GLOBALS['dbh']) . "\n";
然后,您可以使用错误号确定错误的详细原因:

如果您的代码挂起在查询上,您可以尝试在mysql命令行客户端中描述并运行查询,以查看是否存在数据大小问题。您还可以增加最大执行时间,以允许查询完成并查看发生的情况:

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

我不知道您的表的大小,但请尝试使用
LIMIT 10
,看看是否仍然挂起


可能您的表太大,无法在一个查询中获取数据。

等待mysql查询返回数据的时间不计入执行时间


问题最有可能出现在代码的其他地方——您所指责的函数可能是在无限循环中调用的。尝试注释mysql代码,看看我是否正确。

除非hasCoordinates()的参数$houseNumber和$streetName已经为mysql查询进行了清理(不太可能),您需要使用它们来防止(有意或无意)sql注入。为了使mysql_real_escape_string()能够正常工作(例如,如果您通过更改了字符集),还应该将mysql连接资源传递给函数

是否将设置为E_ALL,是否查看Web服务器的error.log(或已将display_erorrs=On)

试试这个

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;
}
函数有坐标($houseNumber,$streetName){
$houseNumber=mysql\u real\u escape\u字符串($houseNumber);
$streetName=mysql\u real\u escape\u字符串($streetName);
$query=”
解释选择
液化天然气
从…起
地理缓存
哪里
豪斯=“$houseNumber”
街道名称=“$StreetName”
";
$result=mysql\u query($query)或die(mysql\u error());
while(false!=($row=mysql\u fetch\u array($result,mysql\u ASSOC))){
echo htmlspecialchars(join(“|”),“
\n”; } 死亡 }

请参阅以解释输出。

-如果您将执行时间增加到300秒,但它仍然经过了300秒,我认为根据定义,您得到了类似于无限循环的结果

-我的第一个疑点是您的php代码,因为mysql用于处理大型数据集,所以一定要确保您实际访问的是有问题的mysql查询(在查询之前发出错误消息或其他信息)

-如果这样做有效,那么可以尝试通过一些数据库gui或通过对数据库的命令行访问(如果有的话)使用数据库中的已知数据实际运行该查询,如果没有,则用已知的正确数字替换代码


-如果查询本身可以工作,那么我会检查$HOUSENAMER或$streetName变量是否存在意外的sql注入,正如VolkerK所提到的。

表有多大?数据库不是很大。这是一个房地产网站,
geocache
表保存了房屋的GPS坐标,以显示在地图上。站点中的其他查询也可以,但我找不到任何有意义的差异。您是否尝试过使用相同的连接信息在小表上运行一些简单的查询?如果没有延迟,那么您可能可以排除连接问题/超时,这很可能是某个地方的无限循环。另外,表中总共有多少行,表中有哪些索引?即使您“只查找一条特定记录”,MySQL也可能会扫描整个表;也行。使用零的值来完全禁用时间限制。我尝试过这个,只是需要大量的时间才能超时now@Carson,如果是这样的话,那么它几乎肯定是某个地方的一个无限循环。事实上,我在错误的答案下发布了它。它永远不会通过查询,并且没有无限循环。。。它只是一个在itI中带有查询调用的函数。我更改了代码,只获取我需要的列(我将其更改为星形,以防语法错误,但这是它最初的样子),它仍然不起作用。选择更少的列肯定会有帮助,但其他因素包括选择了多少行
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;
}