如何在 MySQLI 中使用准备好的语句?

Posted

技术标签:

【中文标题】如何在 MySQLI 中使用准备好的语句?【英文标题】:How to use prepared statement with MySQLI? 【发布时间】:2010-05-18 19:26:25 【问题描述】:
$mysqli = new mysqli("localhost", "root", "", "test");
$mysqli->query('PREPARE mid FROM "SELECT name FROM test_user WHERE id = ?"');
// working code start
//$res = $mysqli->query('PREPARE mid FROM "SELECT name FROM test_user"  ');
//$res = $mysqli->query( 'EXECUTE mid;') or die(mysqli_error($mysqli));
// working code end..
$res = $mysqli->query( 'EXECUTE mid 1;') or die(mysqli_error($mysqli));

while($resu = $res->fetch_object()) 
    echo '<br>' .$resu->name;

错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“1”附近使用正确的语法

我的php版本是PHP Version 5.3.0和mysql

mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

没有使用where clause,我得到了正确的结果

【问题讨论】:

【参考方案1】:

对 SELECT 查询使用准备函数:

http://php.net/manual/en/mysqli.prepare.php

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) 

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    /* close statement */
    $stmt->close();

【讨论】:

我怎么能多次调用这个? 这里的想法是您准备查询、绑定值、执行准备好的查询、绑定其他值、使用这些新值再次执行准备好的查询等。所以只需再次调用execute() .更多信息:php.net/manual/en/mysqli-stmt.execute.php【参考方案2】:

http://dev.mysql.com/doc/refman/5.1/en/execute.html

您需要在 EXECUTE 语句中有一个 using 子句。所以你可以这样做:

$mysqli = new mysqli("localhost", "root", "", "test");
$mysqli->query('PREPARE mid FROM "SELECT name FROM test_user WHERE id = ?"');
$mysqli->query('SET @var1 = 1;');
$res = $mysqli->query( 'EXECUTE mid USING @var1;') or die(mysqli_error($mysqli));

【讨论】:

以上是关于如何在 MySQLI 中使用准备好的语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MySQLi 准备好的语句与存储过程一起使用

如何使用mysqli准备好的语句?

如果在循环中使用 MySQLi 准备好的语句,我啥时候调用 bind_param?

如何使用索引号将数据发送到mysqli(准备好的语句)

如何查看准备好的语句的内容?

2个准备好的语句,2个存储过程,1个mysqli连接