搜尋

首頁  >  問答  >  主體

PHP警告:不能將陣列轉換為字串

<p>我在我的文件中有這段程式碼:</p> <pre class="brush:php;toolbar:false;">if (is_array($_REQUEST)) $cepl=implode(' ', $_REQUEST);</pre> <p>每隔幾天我在php日誌中收到以下警告: PHP 警告:在 /file.php 的第76行,將陣列轉換為字串</p> <p>第76行是:$cepl=implode(' ', $_REQUEST);</p> <p>我找不出是什麼原因導致了這個警告? ! </p>
P粉101708623P粉101708623461 天前465

全部回覆(1)我來回復

  • P粉449281068

    P粉4492810682023-08-16 17:52:28

    函數implode的定義與下面的程式碼(這只是一個範例,未經測試)非常粗略地等效:

    function not_really_implode($glue, $pieces) {
       $result = '';
       $first = true;
       foreach ( $pieces as $piece ) {
          if ( ! $first ) {
              $result .= $glue;
          }
          $pieceAsString = (string)$piece;
          $result .= $pieceAsString;
          $first = false;
       }
       return $result;
    }

    關鍵點在於這一行程式碼:$pieceAsString = (string)$piece; - 為了組合陣列的元素,implode必須將每個元素逐一轉換為字串。

    現在考慮一下如果$pieces看起來像這樣:

    $pieces = [
       'one',
       ['two-a', 'two-b'],
       'three',
    ];

    在我們的循環中的某個時刻,我們將有$piece = ['two-a', 'two-b'],並嘗試將其轉換為字串 - 糟糕!

    因此,警告出現的原因是因為在你的$_REQUEST陣列中,存在其他陣列。這可能發生的幾種方式:

    1. $_REQUEST可以直接寫入。例如,有人可以寫入$_REQUEST['example'] = ['a', 'b'];
    2. PHP會辨識輸入中的某些表示法來表示陣列。例如,有人可以訪問URL/your-page.php?example[]=a&example[]=b$_REQUEST將自動填入為['a', 'b ']

    這帶來了一個非常重要的提醒:永遠不要相信使用者輸入! 對於$_REQUEST中的內容做任何假設都非常危險,因為該輸入在用戶的控制之下,而用戶可能並非你的朋友。

    回覆
    0
  • 取消回覆