Отображать все строки в столбце с помощью foreach

#php #pdo #foreach

#php #pdo #foreach

Вопрос:

Я пытаюсь использовать foreach для отображения каждой строки в столбце. Но я получаю:

Предупреждение: Недопустимый аргумент, предоставленный для foreach()

Вот мой код:

 <?php
$user = user;
$pass = pass;
$dbh = new PDO('mysql:host=localhost;dbname=onlyaskf_registered', $user, $pass);

$stmt = $dbh->prepare("SELECT COUNT(*), sum(price),part_number,location,price FROM products WHERE code = :usercode");
$stmt->bindParam(':usercode', $_SESSION['MM_Username']);

?>

<?php 
if ($stmt->execute()) {
    foreach($stmt->fetchColumn(2) as $row) {
        echo $row;
    }
}  
?>
  

С помощью этого кода я могу получить первую строку в столбце:

 <?php 
if ($stmt->execute()) {
    $row = $stmt->fetchColumn(2);
    echo $row;
}  
?>
  

Столбец 2 — это мой столбец part_number, если я отформатирую свой php, как указано выше, это даст мне первый экземпляр строки этого столбца. Как мне заставить его отображать каждую строку в столбце с помощью foreach? Возможно ли это вообще или есть лучший способ повторить строки всего столбца?

Обновить:

Я изменил свой код на этот, но он дает мне только значение столбца первой строки вместо каждой строки:

 <?php if ($stmt->execute()) {
while($val = $stmt->fetch()) { 
echo $val['part_number'];
}
}  ?>
  

Комментарии:

1. print_r($row) вы получите представление о том, как это будет отображаться

2. @devpro Я изменил echo $ row; на print_r ($ row), хотя это по-прежнему дает мне тот же результат, и я получаю предупреждение: недопустимый аргумент, предоставленный для foreach ()

3. попробуйте то же самое с @marc-b example

4. @devpro Это дает мне весь массив следующим образом: Array ( [COUNT(*)] => 3[part_number] => 14124 [location] => here town как я могу настроить его так, чтобы он отображал ТОЛЬКО все строки в part_number столбце?

5. @devpro вот и все, СУММА группировала все, вот почему я получал только одну строку в цикле. Большое спасибо за помощь!

Ответ №1:

После вашего обновления код не выдает вам первую строку, он выдает вам одну строку только из-за SUM() функции в вашем запросе:

 SELECT COUNT(*), sum(price),part_number,location,price FROM products
  

Обратите внимание, что SUM() will возвращает общую сумму числового столбца.

Итак, в вашем случае вам нужно удалить sum(price) функцию из вашего запроса, чем вы получите все строки.

Вы можете использовать PHP для этой цели что-то вроде:

 $sum = 0;
while($val = $stmt->fetch()) { 
    $sum  = $val['price'];
}
echo $sum; // will return sum of all rows.
  

Ответ №2:

fetchColumn() не возвращает массив, поэтому вы не можете выполнить foreach для него. Вы используете while вместо:

 while($val = $stmt->fetchColumn(2)) { 
    echo $val;
}
  

Но обратите внимание, что это НЕ УДАЕТСЯ, если вы извлекаете логическое поле. Согласно примечанию в документах:

Примечание:

PDOStatement::fetchColumn() не следует использовать для извлечения логических столбцов, поскольку невозможно отличить значение FALSE от того, что строк для извлечения больше нет. Вместо этого используйте PDOStatement::fetch().

Комментарии:

1. это устранило предупреждение, которое я получал, теперь оно выводит значение с надписью ‘Array’ после переключения на fetch(). Как я могу заставить это отображать строки столбца?

2.@holodout: теперь вы можете выбрать, что print_r($val) $val является массивом, поэтому, когда вы пытаетесь отобразить массив, он всегда выдает u Array 🙂 и я уже упоминал в комментарии, что то же самое с этим примером

3. fetch() ДЕЙСТВИТЕЛЬНО возвращает массив… вам ДЕЙСТВИТЕЛЬНО нужно научиться читать документы, а не просто слепо повторять код.