我想把一个站点从一些写得不好的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/