@storm-coder

Что не так с функцией?

Функция getOrders(), которая должна возвращать многомерный массив с информацией о всех заказах, включая персональные данные покупателя и список его товаров - не возвращает список товаров заказа.

// функция, которая которая возвращает многомерный массив с информацией о всех заказах, включая персональные данные покупателя и список его товаров
function getOrders(){<img src="https://habrastorage.org/webt/61/7f/6d/617f6da2cb529679489225.jpeg" alt="image"/>
	global $link;
	if (!is_file(ORSERS_LOG)) { // файл существует
		return false;
	} else {
		$orders = file(ORSERS_LOG); // получить в виде массива персональные данные пользователей из файла ("orders.log")
		$allorders = []; // массив, который будет возвращен функцией

		foreach ($orders as $order) {
			list($name, $email, $phone, $address, $orderid, $date) = explode("|", $order);
			$orderinfo = []; // промежуточный массив для хранения информации о конкретном заказе
			// сохранение информации о конкретном пользователе
			$orderinfo["name"] = $name;
			$orderinfo["email"] = $email;
			$orderinfo["phone"] = $phone;
			$orderinfo["address"] = $address; // var_dump($address); => string(8) " ulitsa " array(0) { } string(5) " USA
			$orderinfo["orderid"] = $orderid; var_dump($orderid); // => string(15) " 617ee061ae2da " array(0) { } string(15) " 617ef4e3a6adb "
			$orderinfo["date"] = $date;
			// SQL-запрос на выборку из таблицы orders всех товаров для конкретного покупателя
			$sql = "SELECT title, author, pubyear, price, quantity
						FROM orders
						WHERE orderid = '$orderid' AND datetime = $date"; // скорее всего проблема в этом запросе
			// получение результата выборки
			if (!$result = mysqli_query($link, $sql)) { // соединение - ok
				return false;
			} else {
				$items = mysqli_fetch_all($result, MYSQLI_ASSOC);
				mysqli_free_result($result); 
				// сохранение результата в промежуточном массиве
				$orderinfo["goods"] = $items;
				// добавление промежуточного массива в возвращаемый массив
				$allorders[] = $orderinfo;
			}
			 var_dump($items); // => ["goods"]=> array(0)
		}
	}
				return $allorders;
}

// без этого участка кода "orderid = '$orderid' AND " в SQL-запросе: var_dump($items); // => ["goods"]=> array(2)


617f7010096d8489384630.jpeg
  • Вопрос задан
  • 133 просмотра
Решения вопроса 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Настал момент познакомиться с такими понятиями, как отладка и безопасное выполнение SQL запросов.

Программисты не задают посторонним вопрос, "почему мой код не работает".
Они задают его своему коду.

Вы уже начали отлаживать свой код, выводя промежуточные результаты. Это очень хорошо. Но почему-то тут же остановились

Ну если запрос не находит записей - разве не логично вывести его на экран и посмотреть, что с ним не так.

А после того, разберётесь с запросом, надо будет его переписать на подготовленные выражения. Потому что вот это вот - это какой-то позор
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Вот там где у вас
if (!$result... ) {
        return false

Неплохо бы добавить throw New Exception($sql . PHP_EOL . $mysqli->error);
Или хотя бы echo $sql . PHP_EOL . $mysqli->error;

Очень большая вероятность того, что есть проблема с кавычками вокруг orderid и даты.
Ну и переход на prepared statements сделает эти ошибки невозможным, и ещё от ряда косяков защитит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы