【问题标题】:Confused by result of printing associative array with PHP对使用 PHP 打印关联数组的结果感到困惑
【发布时间】:2018-07-04 20:46:07
【问题描述】:

我正在尝试使用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],但我不知道怎么做。

【问题讨论】:

标签: php arrays syntax-error associative-array


【解决方案1】:

当使用未定义的常量时,PHP 将自动假定字符串是预期的。 [sic]

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 } ?>

【讨论】:

    【解决方案2】:

    从 MySQL 返回的关联数组中的键是字符串 - 您需要引用它们:

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

    【讨论】:

    • 但是为什么它在没有引号的形式中起作用? &lt;input type='text' name='first_name' value=$row[first_name]&gt;
    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多