Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 迭代PDO查询的结果_Php_Mysql_Pdo - Fatal编程技术网

Php 迭代PDO查询的结果

Php 迭代PDO查询的结果,php,mysql,pdo,Php,Mysql,Pdo,我想基于URL参数中的数据使用PDO运行查询(是的,我知道这很容易受到攻击,但它的内部代码是实用程序) 它返回正确的行计数,但在其他方面没有帮助 最后,我尝试用如下内容替换foreach行: $rows = $products->fetchAll(); foreach ($rows as $row) { 我尝试对固定查询执行相同的操作都很好,但是我在确定如何在查询中放置变量元素,然后对结果进行迭代时遇到了问题。尝试一下(如果我理解正确): 我个人更喜欢while,因为您不需要在一个var

我想基于URL参数中的数据使用PDO运行查询(是的,我知道这很容易受到攻击,但它的内部代码是实用程序)

它返回正确的行计数,但在其他方面没有帮助

最后,我尝试用如下内容替换foreach行:

$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)