Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 准备语句使命令不同步;现在无法运行此命令_Php_Mysqli_Prepared Statement - Fatal编程技术网

Php 准备语句使命令不同步;现在无法运行此命令

Php 准备语句使命令不同步;现在无法运行此命令,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我已经阅读了我能想到的所有东西来得到解释,但似乎没有任何帮助。如果有人能指出明显的问题,或者给我一点错误的想法。我已经通读了php.net和mysqli标签,似乎无法理解这一点。我读到的所有东西都说你不能发送两个查询,但我只尝试一个。任何帮助都将不胜感激 这个->-说明可能我有多个结果集,但我不确定这有多大意义,也不确定我能做些什么来获得准备语句内部工作的更多细节 我的代码: class mydb { public function __construct() { //

我已经阅读了我能想到的所有东西来得到解释,但似乎没有任何帮助。如果有人能指出明显的问题,或者给我一点错误的想法。我已经通读了php.net和mysqli标签,似乎无法理解这一点。我读到的所有东西都说你不能发送两个查询,但我只尝试一个。任何帮助都将不胜感激

这个->-说明可能我有多个结果集,但我不确定这有多大意义,也不确定我能做些什么来获得准备语句内部工作的更多细节

我的代码:

class mydb {

    public function __construct() {
        // Connect to Database
        $this->mydb = new mysqli('****', '***', '***', '***');
        if ($this->mydb->connect_errno) { // Error on connection failure
            echo "Failed to connect to MySQL in Construct: (" . $this->mydb->connect_errno . ") " . $this->mydb->connect_error;
        }
    }

    public function choose ($select, $from, $config = 0, $options = NULL) {
        if ($config === 0) { /** Configure statement for prepare depending on options */
            $stmt = 'SELECT ' . $select . ' FROM ' . $from;
        } elseif ($config === 1) {
            $stmt = 'SELECT ' . $select . ' FROM ' . $from . ' WHERE ' . $options['where_comp'] . ' LIKE ?';
        } elseif ($config === 2) {
            $stmt = 'SELECT ' . $select . ' FROM ' . $from . ' WHERE ' . $options['where_comp'] . ' = ?';
        } /** End if/elseif Prepare statemenet */
        $mydb = $this->mydb->prepare($stmt);
        if ($config === 1 || $config === 2) {
            $mydb->bind_param("s",$options['where_value']);
        }

        if ($mydb->execute()) { /** If execute is good then get results */
            $result = $mydb->get_result();
            $payload = array();
            while ($row = $result->fetch_array(MYSQLI_NUM)) {
                $payload[] = $row;
            }
            return $payload;
        } /** End if results */
    } /** End choose class method */
} /** End mydb Class */

$myDB = new mydb();

$agentArray = $myDB->choose('*','`agent`');
使用php.net示例并对其进行了修改,以显示更好的示例:

$mysqli = new mysqli('host', 'database', 'user', 'pass');
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!($stmt = $mysqli->prepare("SELECT ? FROM ?"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}

if (!($res = $stmt->get_result())) {
    echo "Getting result set failed: (" . $stmt->errno . ") " . $stmt->error;
}

for ($row_no = ($res->num_rows - 1); $row_no >= 0; $row_no--) {
    $res->data_seek($row_no);
    var_dump($res->fetch_assoc());
}
$res->close();

本页相关部分的第一个结果意味着它是在你挣扎着写问题时提供给你的

一般来说,根据错误消息很容易找到问题的答案。你只需要不停在第一个搜索结果,而是继续多一点

但是,在这个函数上选择您的。我发现它非常不切实际、不安全,而且毫无用处:

不切实际,因为它不允许您使用SQL,但它的子集非常有限。 而且这也使得你的代码非常难以理解。 不安全,因为它不为所有动力部件提供保护,但仅在有价值的地方提供保护 没用,因为它可以节省你没有那么多,值得一团混乱。 看,你认为你节省了两个词-选择和从

然而,您使这段代码难以理解、难以维护,并且无法运行最简单的JOIN。为什么不去呢。更不用说实际代码比常规SQL查询长:

$sql = 'SELECT * FROM `agent` WHERE name LIKE ?';
$agentArray = $myDB->query($sql, "%bob%");

哪一个更容易阅读?

添加if语句以正确显示错误实际上会给出一个mysql错误响应,可以使用:

if (!($stmt = $mysqli->prepare("SELECT ? FROM ?"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
错误响应: 准备失败:1064您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“?”附近使用的正确语法


-您不能通过准备好的语句传递标识符,您应该只对从用户输入传递的值使用它

您不能使用表名或列名作为参数,这是我注意到的第一件事;应为$payload[]=$row;圆点。removedArg我希望这在文档中更加明显。也许我只是错过了准备好的语句的全部目的,或者我正在清理不是用户输入的东西。是时候重新思考这整个课堂了哈哈,谢谢大家!此外,类构造函数不应该返回任何内容查看它的范围现在看起来很无用,但我向您保证,从长远来看,它会更有意义。我不喜欢加入,我的系统设计是为了避免这种情况,但我会记住这一点。类的概念本质上是编写不合理或有限的代码,这些代码可以正常工作,然后很容易地在以后更改格式,而不是重新编码整个站点。我发布这段代码的另一个原因是想从其他角度来看待那些已经编写了一段时间的人们通常使用的方法。谢谢你的洞察力!我提供了正确的答案供其他人查看,因为你的答案建议是不正确的。这就是我在执行返回上述结果的execute之前看到问题的方式。我的印象是,如果我的问题不适用于所有示例,那么我应该在稍后的步骤中显示导致我的问题的示例,因为调试中没有显示错误。看到我因为详细解释了这个问题而失去了代表,我感到非常失望。我并不是想偷它的功劳。
if (!($stmt = $mysqli->prepare("SELECT ? FROM ?"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}