Member 13840807 Ответов: 3

Синтаксическая ошибка с использованием списка()


Похоже, у меня есть синтаксическая проблема с использованием функции списка в PHP. В приведенном ниже коде я пытаюсь преобразовать два значения массива в две отдельные переменные, используя одну строку кода. Я знаю, что это возможно с помощью простой переменной. Я могу сделать это успешно на двух отдельных линиях - в соответствии с закомментированными линиями, которые работают просто отлично.
Может ли кто-нибудь помочь с правильным солнечным налогом для линии :-
список($отдаленных, $базовая) = (массива($строки['outlying_price'] ['base_price']));
поскольку эта строка возвращает следующую ошибку:-

Предупреждение: недопустимое смещение строки 'base_price' в C:\wamp64\www\test.php на линии 19
Обратите внимание: неопределенное смещение: 1 дюйм C:\wamp64\www\test.php на линии 19

Что я уже пробовал:

<?php

			include 'database.php';
			$pdo = Database::connect();
			try{
			$collhub = "bet";
			$delhub = "jnb";
			echo $collhub;
			echo $delhub;
			echo "<br>";
			$sql = "SELECT * FROM `new_ice_price_table` WHERE collection_town_code = '$collhub' AND delivery_town_code = '$delhub'";
			$result = $pdo->query($sql);
						if($result->rowCount() > 0){
						//echo "<table class='table table-striped table-bordered sortable'>";
						while($row = $result->fetch()){
						//print_r($row);
						//list($base) = array($row['base_price']);
						//list($outlying) = array($row['outlying_price']);
						list($outlying, $base) = (array($row['outlying_price'] ['base_price']));
						echo "<br>";
						echo $base;
						echo "<br>";
						echo $outlying;
					}
						echo "</table></br>";

						unset($result);
					} else{
						echo "No records matching your query were found.";
					}
					} catch(PDOException $e){
					die("ERROR: Could not able to execute $sql. " . $e->getMessage());
		}			
	?>

Richard MacCutchan

Сообщение совершенно ясное, второе смещение в $row['outlying_price'] ['base_price'] это незаконно, так как массив строк является одномерным.

3 Ответов

Рейтинг:
21

Jochen Arndt

$row это одномерный массив. Поскольку элементы в этом массиве являются строками, вы можете получить доступ к символам элементов с помощью [] оператор. Но для этого требуется передать числовой индекс вместо строкового индекса, как указано в сообщении об ошибке.

Почему вы хотите упаковать возвращенные элементы строки в список? В этом нет никакого смысла. И то же самое делает использование array() на предметах:

// These are the values which are strings
$base_price_value = $row['base_price'];
$outlying_price_value = $row['outlying_price'];
// Would this makes sense?
list($base) = array($base_price_value);
В любом случае вы создаете гораздо более сложную копию уже существующего массива $row.


Рейтинг:
2

Richard MacCutchan

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

list($outlying, $base) = (array($row['outlying_price'], $row['base_price']));

как показано на рисунке PHP: список - руководство пользователя[^].


Рейтинг:
1

Patrice T

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.

<?php

include 'database.php';
$pdo = Database::connect();
try{
  $collhub = "bet";
  $delhub = "jnb";
  echo $collhub;
  echo $delhub;
  echo "<br>";
  $sql = "SELECT * FROM `new_ice_price_table` WHERE collection_town_code = '$collhub' AND delivery_town_code = '$delhub'";
  $result = $pdo->query($sql);
  if($result->rowCount() > 0){
    //echo "<table class='table table-striped table-bordered sortable'>";
    while($row = $result->fetch()){
      //print_r($row);
      //list($base) = array($row['base_price']);
      //list($outlying) = array($row['outlying_price']);
      list($outlying, $base) = (array($row['outlying_price'] ['base_price']));
      echo "<br>";
      echo $base;
      echo "<br>";
      echo $outlying;
    }
    echo "</table></br>";

    unset($result);
  } else{
    echo "No records matching your query were found.";
  }
}
catch(PDOException $e){
  die("ERROR: Could not able to execute $sql. " . $e->getMessage());
}
?>

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]
$sql = "SELECT * FROM `new_ice_price_table` WHERE collection_town_code = '$collhub' AND delivery_town_code = '$delhub'";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Member 13840807

Спасибо за проверку орфографии @ppolymorphe.
Я никогда не просил об уроке техники кодирования или sql-инъекции, а скорее о помощи в одной строке кода. Представленный код просто собран вместе, чтобы включить строку list (), чтобы я мог получить помощь в этом.
Я думал, что ваш ответ будет зарезервирован для stackoverflow.
Поэтому ваш ответ никому не нужен.

Patrice T

"Я никогда не просил об уроке техники кодирования или sql-инъекции, а скорее о помощи в одной строке кода."
Вы никогда не говорили, что знаете отступы и SQL-инъекции и что вам все равно.
Обратите внимание, что отступы предназначены не для вас, а для того, чтобы помочь нам прочитать ваш код.
- Поэтому ваш ответ никому не нужен."
Говорить за себя.

Member 13840807

Вы ни разу не попытались ответить на мой реальный вопрос, а только критиковали мой код. Скорее не отвечайте, если вы не вносите свой вклад в фактический вопрос, поскольку это контрпродуктивно, даже за счет сохранения места главного эксперта......

Patrice T

У вас уже было 2 решения по теме, Когда я это сделал.