Смущает результат печати ассоциативного массива с PHP - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь использовать foreach для печати результатов запроса SQL из ассоциативного массива. Я пробую разные вещи, и один работает, а другой выдает ошибку.

Я специально спрашиваю, почему эта часть $row[first_name] дает разные результаты.

Этот код работает:

<?php
 include 'connect_db.php';
 $stmt = $conn->query("SELECT people.first_name, people.last_name FROM people");
 $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

 foreach ($results as $row) {
    echo "<form action='/test.php' method='post'>
   <input type='text' name='first_name' value=$row[first_name]>
  <input type='submit' value='Click'> <br>
 </form>"; 
 }  
?>

Но следующий код выдает ошибку: Notice: Use of undefined constant first_name - assumed 'first_name'

<?php
 include 'connect_db.php';
 $stmt = $conn->query("SELECT people.first_name, people.last_name FROM people");
 $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

 foreach ($results as $row) {
 echo $row[first_name]; 
 }  
?>

Я, очевидно, неправильно использую $row[first_name] во втором примере, но не могу понять, как.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Когда используется неопределенная константа, PHP автоматически предполагает, что строка предназначена. [так в оригинале]

PHP предполагает, что вы имеете в виду имя самой константы, как если бы ты назвал это как строку

Пример: https://3v4l.org/C7PgT

Как отмечалось в PHP 7.x, это приведет к ОШИБКЕ, а не к предупреждению в будущих версиях, поэтому его следует избегать в пользу использования строк в кавычках

Почему $foo[bar] не так: [sic]

Всегда используйте кавычки вокруг индекса строкового литерала. Например, $foo['bar'] правильно, а $foo[bar] - нет. Причина в том, что этот код имеет неопределенную константу (bar), а не строку ('bar' - обратите внимание на кавычки). если нет определенной константы с именем bar, то PHP подставит в строку 'bar' и будет использовать ее.

Это не значит всегда цитировать ключ. Не заключайте в кавычки ключи, которые являются константами или переменными, так как это помешает PHP интерпретировать их.

Когда вы использовали его в контексте двойных кавычек ("$var"), лексер PHP автоматически использовал текст в скобках ($var[text]) в виде строки.

Также у лексера PHP есть проблемы при использовании массива или объектов в двойных кавычках.

echo "value=$row['first_name']"; //results in a syntax error

Пример: https://3v4l.org/K6fUd

Чтобы решить эту проблему, вам нужно заключить массив в фигурные скобки

echo "value={$row['first_name']}";

Пример: https://3v4l.org/aQ1sJ


Вместо этого я настоятельно рекомендую использовать одинарные кавычки для всего вывода PHP, чтобы избавить вас от необходимости читать между различным синтаксисом и однородностью синтаксиса HTML.

foreach ($results as $row) {
    echo '<form action="/test.php" method="post">
   <input type="text" name="first_name" value="' . $row['first_name'] . '">
  <input type="submit" value="Click"><br>
 </form>'; 
 }  

В качестве альтернативы можно использовать HEREDOC или NOWDOC в зависимости от желаемого выхода.

foreach ($rows as $row) {
    echo <<<EOT
value="{$row['first_name']}"
EOT;

}

Пример (включая HEREDOC): https://3v4l.org/7K5ap

Мой предпочтительный метод - убедиться, что весь синтаксис HTML выводится напрямую или в буфер вывода. Так как он позволяет большинству IDE, таким как PHPStorm, автоматически распознавать его как HTML, а не как PHP-код, чтобы обеспечить правильность синтаксиса HTML и совпадение с другими тегами.

<?php foreach ($results as $row) { ?>
<form action="/test.php" method="post">
    <input type="text" name="first_name" value="<?php echo $row['first_name']; ?>">
    <input type="submit" value="Click"><br>
</form>
<?php } ?>
0 голосов
/ 04 июля 2018

Ключи в ассоциативном массиве, возвращаемые из MySQL, являются строками - их нужно заключить в кавычки:

echo $row['first_name'];
# Here ---^----------^
...