准备好的声明不起作用

时间:2015-11-21 10:58:00

标签: php prepared-statement

如果有一段难以解决的代码..而且我不知道如何找到错误而不是这个。

                while($this->_pathLus != $this->hoofdMap) { //loop works fine, tested and confirmd
                echo $this->_pathLus . 0; //$this->_pathLus = <data4>
                if ($stmtToegang = $db->prepare("SELECT <data>, <data2> FROM `<data3>` WHERE <data> = ? LIMIT 5")) {
                    $stmtToegang->bind_param("s",$this->_pathLus);

                    $stmtToegang->execute();

                    $stmtToegang->bind_result($<data>, $<data2>);

                    while ($stmtToegang->fetch()) {
                        echo $<data> . 1;

                        echo $stmtToegang->error . 2;

                    }
                } else { //to be sure if-stmt-prep is FALSE
                    echo $stmtToegang->error . 3;
                }
                $this->_pathLus = preg_replace("/(.*)\/(.*)\/(.*)\//", "$1/$2/", $this->_pathLus); // part of Loop and works
            }

我做了什么来找到解决方案:

  • 检查$ stmtToegang是否正确无处不在
  • 检查sql-select是否正确
  • 检查_pathLus是否正确
  • 在if-stmt-prep上添加else以确保失败

结果

  • <data4>03<data4>03<data4>03<data4>03<data4>03
  • <data4>03<data4>03<data4>03
  • <data4>03<data4>03<data4>03<data4>03
  • <data4>03<data4>03
  • <data4>03
  • <data4>03<data4>03

注意: <data><data2><data3>是此示例的替代

提前致谢

编辑:更正

编辑:

  

mysqli_prepare()返回一个语句对象,如果有错误则返回FALSE   发生了。

但是如何得到发生的错误?

1 个答案:

答案 0 :(得分:1)

我是如何找到问题的:

我将echo $stmtToegang->error . 3;改为echo $db->error . 3; 这样我发现了以下错误:

  

命令不同步;你现在不能运行这个命令

我找到了解决方案: description

问题是这个stmt-query(选择类型)是另一个stmt-query(选择类型)的一部分,因为:

  

默认情况下,mysqli使用无缓冲的查询(对于预处理语句;)

所以调试嵌套预准备语句(select-type)的代码如下:

if($stmt = $mysqli->prepare($sql)) {
    <$stmt->bind_param()->execute()->bind_result() code>

    $stmt->store_result(); // store them !important

    while ($stmt->fetch()) {
        //code

        if($stmt2 = $mysqli->prepare($sql)) {
            <$stmt2->bind_param()->execute()->bind_result() code>

            $stmt2->store_result(); // store them !important

            while ($stmt2->fetch()) {
                //code
            }
            $stmt2->free_result(); // free them
            $stmt2->close(); // close them

            echo $stmt2->error; // report error
        }  else {
            echo $mysqli->error; // report error
        }
    }
    $stmt->free_result(); // free them
    $stmt->close(); // close them

    echo $stmt->error; // report error
} else {
    echo $mysqli->error; // report error
}

//edit: <$stmt->bind_param()->execute()->bind_result() code> for an better view 

希望它可以帮助somone