почему только первый mysqli_fetch () результат сохраняется в массиве - PullRequest
0 голосов
/ 21 февраля 2020

Я новичок в подготовленных заявлениях mysqli. Я пытаюсь сохранить результаты в ассоциативном массиве, чтобы я мог использовать его дальше. Результаты печатаются правильно перед добавлением в массив, но при добавлении добавляется только первая запись. в чем здесь ошибка в подходе?

// order_details_table
$order_details = array();
$invoice = 1234;
$stmt = $con->prepare("SELECT `description`,`amount` FROM order_details_table WHERE invoice_no = ?");
$stmt->bind_param("s", $invoice);
$stmt->execute();
$stmt->bind_result($description,$amount);
while($stmt->fetch())
{
    print_r($description." ".$amount); //This prints all the entries for the given query
    $row['desc'] = $description;
    $row['amount'] = $amount;
    $order_details += [$row]; //This appends just the first entry
}
print_r($order_details);

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Вы используете оператор объединения массивов. From PHP docs:

Оператор + возвращает правый массив, добавленный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут игнорироваться.

Ваш временный массив имеет тот же ключ как массив, в который вы собираете. Оба имеют элементы с ключом 0, поэтому новая строка не добавляется.

Чтобы исправить это, вы должны использовать массив pu sh, т. Е. [].

while($stmt->fetch())
{
    print_r($description." ".$amount); //This prints all the entries for the given query
    $row['desc'] = $description;
    $row['amount'] = $amount;
    $order_details[] = $row; // Append the new row into the array
}

Однако я не рекомендую такой ручной подход. У mysqli есть методы для извлечения всех строк одновременно. Вместо этого следует использовать fetch_all().

// order_details_table
$invoice = 1234;
$stmt = $con->prepare("SELECT `description`,`amount` FROM order_details_table WHERE invoice_no = ?");
$stmt->bind_param("s", $invoice);
$stmt->execute();
$result = $stmt->get_result(); // Get the result instead of binding
$order_details = $result->fetch_all(MYSQLI_ASSOC);

Если вы действительно хотите l oop по результатам один за другим и создать массив вручную, тогда используйте foreach l oop для объекта mysqli_result .

// order_details_table
$invoice = 1234;
$stmt = $con->prepare("SELECT `description`,`amount` FROM order_details_table WHERE invoice_no = ?");
$stmt->bind_param("s", $invoice);
$stmt->execute();
$result = $stmt->get_result(); // Get the result instead of binding
$order_details = []; // Instanciate empty array
foreach($result as $row)
{
    $newrow['desc'] = $row['description'];
    $newrow['amnt'] = $row['amount'];
    $order_details[] = $newrow; //This appends just the first entry
}
print_r($order_details);
0 голосов
/ 21 февраля 2020

Использовать foreach ($ stmt-> fetch () в качестве $ row)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...