我想将一个网站从一些写得不好的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类存在并且扩展已加载。
如果您看到错误,请与我们联系!
答案 0 :(得分:4)
除了库中的差异之外,两者之间的区别在于,一个使用直接query()
(mysqli_*
),而另一个使用预备语句。无论哪个API正在运行,处理都会有所不同。
使用MySQLi时,执行
$result = $conn->query($sql);
将$result
作为mysqli-result对象,它保存数据。您可以使用mysqli_result::fetch_assoc()
来获取数据。但是,当您使用PDO::prepare()
时,您的$result
变量将是PDOStatement - 这有点不同。您需要首先在其上运行fetch()
方法,然后您可以使用它的返回值,因此
$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);
请注意,我已更改变量的名称。现在$result
是一个数组(如果有任何结果被提取),您可以像通常在获取关联数组时那样使用它。如果没有结果,PDOStatement::fetch()
将返回布尔值false
。
var_dump($result['state']);
您可以将fetch()
方法循环为
while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
如果您期望多行。如上所示,不使用循环使用$result
。
请注意,这假设有效的PDO连接。请注意,不能交换任何MySQL库,mysql_
,mysqli_*
和PDO都是动物园中不同的动物。