我正在尝试使用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]
,但是我不知道怎么做。
答案 0 :(得分:1)
从MySQL返回的关联数组中的键是字符串-您需要引用它们:
echo $row['first_name'];
# Here ---^----------^
答案 1 :(得分:1)
使用未定义的常量时,PHP将自动假定使用了预期的字符串。 [sic]
PHP假设您的意思是常量本身的名称,就像 你把它叫做字符串
如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
要解决此问题,您需要使用大括号将数组包装起来
echo "value={$row['first_name']}";
相反,我强烈建议所有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 } ?>