23

我有一个函数,它根据要插入该列的列名和值的关联数组以及表名(一个简单的字符串)生成准备好的 INSERT 语句:

function insert ($param, $table) {
        $sqlString = "INSERT INTO $table (".implode(', ',array_keys($param)).') VALUES ('.str_repeat('?, ', (count($param) - 1)).'?)';
        if ($statement = $this->conn->prepare($sqlString)):
            $parameters = array_merge(array($this->bindParams($param), $param));
            call_user_func_array(array($statement, 'bind_param', $parameters));
            if (!$statement->execute()):
                die('Error! '.$statement->error());
            endif;
            $statement->close();
            return true;
        else:
            die("Could Not Run Statement");
        endif;
    }

我的问题是 $this->conn->prepare (它是一个类的一部分,conn 是一个新的 mysqli 对象,它可以正常工作)返回 false,但没有给我一个理由!

这是为准备语句构建的示例 $sqlString:

INSERT INTO students (PhoneNumber, FirstName, MiddleInit, LastName, Email, Password, SignupType, Active, SignupDate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)

任何人都可以看到这个参数化语句有问题吗?准备函数返回false的任何原因?

4

2 回答 2

70

我将解决方案复制到此答案中,以便对此给予支持,否则该问题将永远出现在“未回答的问题”中。我将这个答案标记为 CW,所以我不会得到任何分数。

@Andrew E. 说:

我只是打开 mysqli_report(MYSQLI_REPORT_ALL)以更好地了解正在发生的事情 -结果我的一个字段名称不正确- 你会认为这prepare()会引发异常,但它会默默地失败。

于 2009-08-02T23:42:23.700 回答
-1

这些是我遇到此问题的主要原因。

  • 查询中的错误
  • 尝试同时运行两个查询(命令不同步)

首先你需要知道确切的原因。为此,添加以下代码。

if ($stmt === FALSE) {
   die ("Error: " . $mysqli->error);
}

如果您同时运行两个查询,则存储第一条语句中的值将解决该问题。

$first_stmt->store_result()
于 2021-06-22T05:35:23.080 回答