#php #mysql #arrays #pdo
#php #mysql #массивы #pdo
Вопрос:
Я пытаюсь добавить результаты запроса в массив. Мой оператор while работает, но я ничего не получаю в своем массиве. Вот мой код:
$res=$pdo->query("select * from questions where category_id='$category' ORDER BY RAND()");
$rows = $res->rowCount();
if ($rows < 1){
echo "There is no question in the database";
exit();}
$questionsArray = array();
while ($item = $res->fetch(PDO::FETCH_ASSOC)){
$questionsArray[] = $item;
echo "There should be some info here<br>";
}
Комментарии:
1. вы уверены, что у вас нет опечатки везде, где вы на самом деле используете массив? если вы получаете
There should be some ...
выходные данные, значит, выборка работает. где / как вы будете использовать$questionsArray
позже?2. попробуйте поставить
print_r($questionsArray)
после закрытия while3. какой результат вы получаете, когда используете
var_dump($item)
в своемwhile()
цикле?
Ответ №1:
Возможно, вы захотите рассмотреть что-то подобное с помощью подготовленных инструкций через PDO. Кроме того, цикл while с выборкой плохой и медленный, и был хорош 15 лет назад с MySQL.
Вот правильный способ сделать это.
define("SQLHOST", "127.0.0.1");
define("SQLUSER", "user");
define("SQLPASS", "password");
define("SQLSGBD", "database");
try {
$con = new PDO('mysql:host=' . SQLHOST . ';dbname=' . SQLSGBD . ';charset=UTF8', SQLUSER, SQLPASS);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
var_dump('Connection failed: ' . $e->getMessage());
}
$categories = ['A', 'B', 'C'];
$questionsArray = array();
$stmt = $con->prepare("select * from questions where category_id=? ORDER BY RAND()");
foreach ($categories as $key => $cat) {
$stmt->bindParam(1, $cat, PDO::PARAM_STR);
$stmt->execute();
$obj = $stmt->fetchall(PDO::FETCH_ASSOC);
if (count($obj) !== 0) {
foreach ($obj as $key2 => $item) {
$questionsArray[] = [$cat => $item];
}
}
}
Комментарии:
1. Ваши идеи о while operator таковы… своеобразно. Не говоря уже о том, что этот пост вообще не затрагивает вопрос.