Php 迭代PDO查询的结果
我想基于URL参数中的数据使用PDO运行查询(是的,我知道这很容易受到攻击,但它的内部代码是实用程序) 它返回正确的行计数,但在其他方面没有帮助 最后,我尝试用如下内容替换foreach行:Php 迭代PDO查询的结果,php,mysql,pdo,Php,Mysql,Pdo,我想基于URL参数中的数据使用PDO运行查询(是的,我知道这很容易受到攻击,但它的内部代码是实用程序) 它返回正确的行计数,但在其他方面没有帮助 最后,我尝试用如下内容替换foreach行: $rows = $products->fetchAll(); foreach ($rows as $row) { 我尝试对固定查询执行相同的操作都很好,但是我在确定如何在查询中放置变量元素,然后对结果进行迭代时遇到了问题。尝试一下(如果我理解正确): 我个人更喜欢while,因为您不需要在一个var
$rows = $products->fetchAll();
foreach ($rows as $row) {
我尝试对固定查询执行相同的操作都很好,但是我在确定如何在查询中放置变量元素,然后对结果进行迭代时遇到了问题。尝试一下(如果我理解正确):
我个人更喜欢while,因为您不需要在一个var中获取整个查询,从而减少了所需的内存量
我还建议您使用参数,以仅获取所需的数组类型
顺便说一句,您需要知道,不应该使用它来计算SELECT返回的行数。正如php.net所说:
如果关联的PDO语句执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都能保证这种行为,便携式应用程序也不应依赖这种行为
您没有做任何事情来存储结果:
$products->execute(array($cat));
需要输入一个变量:
$result = $products->execute(array($cat));
然后,不要调用$products->fetchAll()
,而是使用$results->fetchAll()
:
我发现使用
$query
变量(用于prepare
等)然后将结果转换为类似$result
或$product
的内容更容易。使代码更易于阅读 如果您在第一个示例中使用占位符,则不应受到攻击。在第二个示例中,字符串中有$cat
,您很容易受到攻击。不要这样做。攻击的发生是因为注入了未替换的数据。使用占位符将确保它被正确转义,因此最好尽可能使用占位符,并且在少数情况下不能使用占位符时要格外小心。对于参数化查询,我想我需要使用prepare
和execute
,不是吗?当我这样运行它时,它不会在query
行之外执行。我确实尝试过将fetchAll()
放在foreach
之外的想法,但似乎没有什么不同。对不起,我走得太快了!是的,就是这样,你必须预先准备好你的请求。在那里,我改进了我的答案;)web应用程序有两个基本要素:1。数据量相对较小,适合一个大小合理的网页。2.一个好的应用程序总是先获取所有数据,然后使用模板开始输出。你是对的。。。理论上。数据量并不是很小。你设法使它变小了。如果你有一个100万用户的列表,你不会在你的页面中加载所有用户,你会加载30个最常用的用户,或者类似的东西。问题中显示的查询,SELECT*FROM products,其中cat_id像$cat
可以返回数百万条条目,将它们加载到一个对象中,并获得乐趣。我相当确定->execute()
方法没有返回数据,它只是更改PDO对象的状态,并使其接受fetchAll()
等等。尽管如此,我还是试过了。在本例中,当使用->rowCount()
进行测试时,程序没有指示$result
变量中存在任何行,因此我不确定这是否是我所需要的。fetchAll()
只应在1时使用。您正在使用它的一个特殊标志来构造特定的非标准结果集或2。您不打算在同一层/方法中迭代数据。当您的代码将立即迭代时,只需在迭代时获取每一行。
$products = $productDB->prepare("SELECT * FROM products WHERE cat_id LIKE :cat");
// Now, you can either do this :
$products->bindParam('cat', '%'.$cat.'%');
$products->execute();
// or you can call execute with an associative array of your parameterized query.
$products->execute(array('cat' => '%'.$cat.'%'));
// Then, get all the results like this :
$rows = $products->fetchAll();
foreach ($rows as $row) {
// Do work here ..
}
// Or, like this :
while ($row = $products->fetch(PDO::FETCH_ASSOC)) {
// Do work here ..
}
$products->execute(array($cat));
$result = $products->execute(array($cat));
foreach ($result->fetchAll() as $row)