簡體   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