【问题标题】:Can't get prepared statements in PHP to work with MySQL无法在 PHP 中获得准备好的语句以与 MySQL 一起使用
【发布时间】:2013-04-01 20:06:06
【问题描述】:

mysql 控制台我有这个

mysql> SELECT `name`, `lastname` FROM `tblStudents` WHERE `idStudent`='2';
+--------------+-----------------+
|     name     |    lastname     |
+--------------+-----------------+
|     Lucio    |    Martínez     |
+--------------+-----------------+
1 row in set (0.00 sec)

所以我想在 PHP 中使用准备好的语句来获取这个学生的姓名和姓氏。

这是代码:

$mysqli = $this->ConnectLowPrivileges();
echo 'Connected<br>';
$stmt = $mysqli->prepare("SELECT `name`, `lastname` FROM `tblStudents` WHERE `idStudent`=?");
if (false==$stmt){
    die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}
$id = 2;
if ($rc = $stmt->execute(array($id))){
    if ($row = $stmt->fetch()){
        echo "Name: {$row[0]}.<br>Last name: {$row[1]}.<br>";
        echo 'Another way:'.print_r($row);
    }
}
if (false==$rc){
    die('execute() failed: ' . htmlspecialchars($stmt->error));
}
echo 'done';
mysqli_close($mysqli);
return true;

第二个条件给出 false,我得到的输出是这样的:

Connected
execute() failed: 

PHP 与数据库的连接没有问题。

我不知道确切的错误,因为$stmt-&gt;error 什么也没返回。

【问题讨论】:

  • 你需要先给自己一些教程。只使用随机运算符不会有任何好处。对于初学者来说,一个简单的谷歌搜索“mysqli 教程”就足够了。一旦你得到这样的教程,试着运行他们提供的例子。一旦熟悉了它们,您就可以开始根据需要采用这些示例代码。
  • @YourCommonSense 我一个星期以来一直在搜索,阅读帖子,文章,尝试了几个代码。但我无法让它工作。
  • 你需要bind_param使用MySQLi类。execute不允许绑定参数(除非你使用PDO)。因此,绑定参数$id,您的查询应该会运行。
  • @Jon 所以在使用bind_param() 之后我需要运行execute() 吗?
  • 是的,在您执行查询之前不会运行查询,绑定参数只是将其放置到位以便您可以运行它。

标签: php mysql mysqli prepared-statement


【解决方案1】:

为避免进一步的 cmets,请阅读我在该问题上发布的所有 cmets 和链接以了解,并将代码更改为:

$mysqli = $this->ConnectLowPrivileges();
echo 'Connected<br>';
$stmt = $mysqli->stmt_init();
$stmt->prepare("SELECT `name`, `lastname` FROM `tblStudents` WHERE `idStudent`=?");

$id = 2;
$stmt->bind_param('i', $id);
if ($stmt->execute()){
    $stmt->bind_result($name, $lastname);
    if ($stmt->fetch()){
        echo "Name: {$name}<br>Last name: {$lastname}<br>";
        //echo 'Another way:'.print_r($row, true); //won't work with bind_result
    } else {
        echo "No results";
    }
} else {
    die('execute() failed: ' . htmlspecialchars($stmt->error));
}
echo 'done';
stmt->close();
$mysqli->close();

【讨论】:

  • 我刚刚尝试了您的代码,它打印“已连接”,它甚至没有显示“完成”。
  • 再试一次,第一次发答案的时候忘记加stmt_init()了。
  • 我添加了它,我得到了完全相同的结果。
  • 在其中添加了 else 声明。如果“完成”不是echo'd,那么还有其他问题。
  • 现在我知道,在$rc = $stmt-&gt;get_result(); 行之后它会停止。我在它后面添加了一个echo,它没有打印出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多