#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
является массивом, поэтому, когда вы пытаетесь отобразить массив, он всегда выдает uArray
🙂 и я уже упоминал в комментарии, что то же самое с этим примером3. fetch() ДЕЙСТВИТЕЛЬНО возвращает массив… вам ДЕЙСТВИТЕЛЬНО нужно научиться читать документы, а не просто слепо повторять код.