我有以下简单的mysqli php应用程序,它应该可以正常工作。 $ pk被完美接受,并且是有效的ARTICLE_NO,当直接由mysql执行时,查询可以完美运行。我将输出语句放在每个事件以及执行期间除tetsing之外的所有事件之后。 while循环永远不会进入,我不确定为什么。

编辑:我已将问题缩小为返回0行的事实,但我不知道为什么在phpmyadmin中使用相同的查询会得出正确的结果。

edit2:如果我摆脱了while循环,只是

    if (!$getRecords->fetch()) {
    printf("<p>ErrorNumber: %d\n", $getRecords->errno);
}


它显示errno为0。因此,没有读取任何记录,也没有错误,但这是一个有效的查询。

<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
$pk = $_GET["pk"];
$con = mysqli_connect("localhost", "", "", "");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error();
    exit;
}
$con->set_charset("utf8");
echo "test outside loop";
if(1 < 2) {
    echo "test inside loop";
    $query1 = 'SELECT ARTICLE_NO FROM AUCTIONS WHERE ARTICLE_NO = ?';
    if ($getRecords = $con->prepare($query1)) {
echo "inside second loop";
        $getRecords->bind_param("i", $pk);
echo "test after bind param";
        $getRecords->execute();
echo "test after bind execute";
        $getRecords->bind_result($ARTICLE_NO);
echo "test after bind result";
        while ($getRecords->fetch()) {
            echo "test inside while";
            echo "<h1>".$ARTICLE_NO."</h1>";
        }
    }
}


编辑:

我尝试使用以下代码:

<?php
$mysqli = new mysqli("localhost", "", "", "");
$pk = $_GET["pk"];
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
/* prepare statement */
if ($stmt = $mysqli->prepare("SELECT ARTICLE_NAME, WATCH FROM AUCTIONS WHERE ARTICLE_NO = ? LIMIT 5")) {
    $stmt->bind_param("i", $pk);
    $stmt->execute();
    /* bind variables to prepared statement */
    $stmt->bind_result($col1, $col2);
    /* fetch values */
    while ($stmt->fetch()) {
        printf("%s %s\n", $col1, $col2);
    }
    /* close statement */
    $stmt->close();
}
/* close connection */
$mysqli->close();
?>


这在没有$ pk的情况下有效,如果我删除了参数,它将正常工作。通过GET获取pk并不是问题,因为如果我分配$ pk = 1;相反,它仍然会失败。 1是有效的ARTICLE_NO,如果是SELECT ARTICLE_NAME,则可以从拍卖中观看,而ARTICLE_NO = 1 LIMIT 5在phmyadmin中可以正常工作。

编辑:问题是mysqli无法处理bigint,我现在使用k作为字符串,它可以正常工作。

最佳答案

检查以下值:

$getRecords->num_rows


这应该有助于揭示早期的SELECT是否实际返回了任何数据

您可能还需要添加:

$getRecords->store_result()


首先,要确保您已完成整个查询,然后再询问结果集中的行数。

另外-确保将$pk强制转换为整数!传入的值有可能被破坏。

关于php - 准备好的语句导致while循环错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/515893/

10-12 21:19