mysqli_stmt_bind_param导致致命错误:内存大小耗尽

时间:2013-10-28 18:08:03

标签: php mysql

这是一个非常简单的查询:

$qry="SELECT taglink, tagtitle, tagshow FROM taglist_main WHERE tag = ?";
if ($stmt = mysqli_prepare($link,$qry)) {
    mysqli_stmt_bind_param($stmt,"s",$qstring);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt,$taglink,$tagtitle,$tagshow);
    mysqli_stmt_store_result($stmt);
    echo "<p><strong>".mysqli_stmt_num_rows($stmt)."</strong> entries found, shown below.</p>";                         
    while (mysqli_stmt_fetch($stmt)) {
        echo "<li><a href=\"/$taguri\" title=\"$tagtitle\">$tagshow</a></li>";
    }
mysqli_stmt_close($stmt);

然而,php似乎不这么认为。运行查询时,出现以下错误:

Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 4294967296 bytes) in /home/envoyenv/public_html/envoytest/tags/index.php on line 110

使用mysql_stmt_bind_param行时。如果我将该行留出并调整SELECT语句以直接使用字符串变量$qstring,则屏幕上不会显示任何结果(实际上,我在屏幕上显示 NOTHING ,甚至不是echo!)

这不是一个特别大的表(少于300行),此查询应返回10行左右(SELECT语句在phpmyadmin中正常工作,返回预期结果)

我做错了什么?


编辑:

我已经检查确保$ qstring实际上是一个字符串:这是var_dump的结果:string(14)“riskassessment”

2 个答案:

答案 0 :(得分:4)

在@andrewsi的帮助下:

交换mysqli_stmt_bind_result($stmt,$taglink,$tagtitle,$tagshow);mysqli_stmt_store_result($stmt);行的顺序,以便代码片段现在显示为:

$qry="SELECT taglink, tagtitle, tagshow FROM taglist_main WHERE tag = ?";
if ($stmt = mysqli_prepare($link,$qry)) {
    mysqli_stmt_bind_param($stmt,"s",$qstring);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt);
    mysqli_stmt_bind_result($stmt,$taglink,$tagtitle,$tagshow);
    echo "<p><strong>".mysqli_stmt_num_rows($stmt)."</strong> entries found, shown below.</p>";                         
    while (mysqli_stmt_fetch($stmt)) {
        echo "<li><a href=\"/$taguri\" title=\"$tagtitle\">$tagshow</a></li>";
    }
mysqli_stmt_close($stmt);

希望这对那些仍然喜欢编写程序代码的人有用。

答案 1 :(得分:0)

这是一个PHP内存错误:“致命错误”这与mysql无关,因为mysql会产生不同的错误。问题是,PHPMyAdmin在cPanel后端上运行,后端有一个单独的PHP安装和Apache,所以资源限制设置得更高。您的PHP脚本在具有较低规格的单独php环境中运行。我会让你的主机提高你的PHP内存限制阈值,或者看看下面的链接。

Raise Memory Limit