繁体   English   中英

通过打印关联数组用PHP的结果混淆

[英]Confused by result of printing associative array with PHP

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

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

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

当使用未定义的常量时,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] )中的$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>'; 
 }  

可替代地使用定界符或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 } ?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM