【问题标题】:mysqli_prepare() returning NULL because it does not recognize the '?'mysqli_prepare() 返回 NULL,因为它不识别“?”
【发布时间】:2014-01-10 00:17:01
【问题描述】:

我有以下代码。

` $db = mysqli_connect('localhost', 'zyk', 'nuithadit6-6-6', 'phpAdv');

if ( mysqli_connect_errno() )
{
    printf("Connect failed: %s\n", mysqli_connect_errno() );
    exit();
}

    $thisDB = mysqli_prepare($db, "CREATE DATABASE ?");
    echo mysqli_stmt_error($thisDB);;`

运行此代码时,我收到以下警告:

PHP 警告:mysqli_stmt_error() 期望参数 1 为 mysqli_stmt,布尔值在第 13 行的 /Library/WebServer/Documents/phpAdvanced/cap1/createDB.php 中给出。

如果我将 mysqli_prepare 函数的第二个参数更改为以下内容:

“创建数据库 myDB”

然后警告消失。当查询字符串中有变量时,mysqli_prepare 似乎不喜欢它,并且当我以这种方式使用它时,它为 $thisDB 返回 NULL。据我了解,这不是预期的行为。

我一直在阅读手册和论坛,但仍然没有答案。有人知道为什么 mysqli_prepare 没有返回适当的值吗?

mysqli的版本是5.0.8,我的php版本是5.3.15。

【问题讨论】:

  • 绑定变量只能应用于数据值,不能应用于表、列或数据库名称
  • echo mysqli_error($db); 打印什么?
  • mysqli_stmt_error($thisDB); 打印错误字符串,以防 mysqli_prepare() 函数在执行时返回错误。什么样的错误?据我了解,可能是解析作为输入参数提供的语句时出错,或者是与数据库连接相关的任何其他错误。

标签: php variables mysqli null return


【解决方案1】:

Prepared statements 不接受任何 MySQL 标识符的占位符。这包括数据库、表和列名。您应该简单地将表名的净化版本连接到您的语句并使用mysqli_query()

原因是这样的:MySQL会在你准备好的时候解析一个prepared statement,并准备一个完整的执行计划。这包括它将使用哪些表、哪些索引以及它将如何从列中进行选择。当您执行该语句时,它会将变量数据替换到执行计划中并创建一个结果。

如果您尝试准备一个语句,其中包含一个未知的 MySQL 实体(如表),MySQl 将无法创建执行计划。

【讨论】:

  • 我现在明白了。你有什么可以指点我的参考资料,以便我可以更深入地了解这个吗?如果没有,我想我将不得不更好地阅读 php 手册。非常感谢您的回答。
  • Wikipedia 有一个很好的概述。 MySQL 的权威参考是here
猜你喜欢
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 2019-01-20
  • 2021-02-03
  • 1970-01-01
  • 2021-05-02
  • 2021-09-14
  • 1970-01-01
相关资源
最近更新 更多