我想把一个站点从一些写得不好的MySQLi迁移到干净的PDO。
我看了三个类似的问题和他们的答案,这是一个直截了当的问题,但没有一个给我结果。这是我的代码:

$state = "Alaska";

//trying to implement PDO here
$sql = "SELECT * FROM sales WHERE state = ? ORDER BY type";
$result = $conn->prepare($sql);
$result->execute(array($state));

/*
this was the old, successfully working way before
$sql = "SELECT * FROM sales WHERE state = '$state' ORDER BY type";
$result = $conn->query($sql);
*/

这个网站上以前的问题给我的答案看起来像我的PDO实现,但我的不起作用。我已经确定了PDO类的存在,并且扩展了加载。
如果你看到错误,告诉我!

最佳答案

除了库中的差异之外,两者的区别在于一个使用直接query()(Themysqli_*),而另一个使用准备好的语句。不管哪个API正在运行,它们的处理方式都有些不同。
使用MySQLi时

$result = $conn->query($sql);

会有一个mysqli result对象来保存数据。您可以在上面使用$result来获取数据。但是,当您使用mysqli_result::fetch_assoc()时,您的PDO::prepare()变量将是一个PDOStatement,这有点不同。首先需要对它运行$result方法,然后可以使用它的返回值,如下所示
$state = "Alaska";
$sql = "SELECT * FROM sales WHERE state = ? ORDER BY type";
$stmt = $conn->prepare($sql);
$stmt->execute(array($state));
$result = $stmt->fetch(PDO::FETCH_ASSOC);

注意,我已经更改了变量的名称。现在fetch()是一个数组(如果有任何结果被获取),您可以像通常在获取关联数组时那样使用它。如果没有结果,$result将返回布尔值。
var_dump($result['state']);

您可以将PDOStatement::fetch()方法循环为
while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {

如果你期望不止一排。使用false就像不使用循环一样,如上图所示。
注意,这假设有一个有效的PDO连接。请注意,不能交换任何MySQL库,fetch()$result和PDO都是动物园中的不同动物。
PHP.net on mysql_
Can I mix MySQL APIs in PHP?

关于php - PDO查询未显示数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45225683/

10-12 07:35
查看更多