PHP Warningが出た時の例と対処法についてまとめています。
WordPressの自作ショートコードでPHP Warningが出た例
ショートコードでカテゴリを選んで新着投稿記事を出力しようとしていたところ思うような出力にならず、ログを確認したところ下記のPHPwarningが出ていました。
PHP Warning: urlencode() expects parameter 1 to be string, array given in /wp-includes/formatting.php on line 5501
この警告メッセージは、urlencode()関数が、文字列以外の配列を第一引数として受け取ったことを示しています。文字列であるべきところに配列がある場合に出る警告ということです。
urlencode()関数は文字列をURLエンコードするための関数であり、文字列以外のデータ型を受け取ることができません。
間違えたコード
3行目のカテゴリスラッグを複数指定する際、array()で囲っていました。
$args = array(
'post_type' => 'post',
'category_name'=> array( 'info', 'item' ),
'post_status' => 'publish',
'posts_per_page' => 10,
'orderby' => 'desc'
);
正しいコード
$args = array(
'post_type' => 'post',
'category_name'=> 'info,item',
'post_status' => 'publish',
'posts_per_page' => 10,
'orderby' => 'desc'
);
「urlencode() expects parameter 1 to be string, array given in...」というPHP Warningが発生する例と対処法
上記ではWordPressでPHP Warningが発生しましたが、そのほか警告になる例を挙げます。
既に説明していますが、この警告メッセージは、通常URLエンコードを行うためにurlencode()関数が呼び出された際に、その関数に渡された引数が文字列ではなく配列だった場合に発生します。
例1:フォームの送信時に、複数の同名の入力フィールドがある場合
例えば、HTMLのフォームで、name属性が同じ複数の入力フィールドがある場合、その入力値は配列として送信されます。そのため、PHPでURLエンコードを行う際に、この配列が誤ってurlencode()関数に渡されることがあります。
同じ名前の入力フィールドが2つあるフォーム
<form action="process_form.php" method="post">
<label>名前:
<input type="text" name="name[]">
</label>
<label>名前:
<input type="text" name="name[]">
</label>
<input type="submit" value="送信">
</form>
name[]
という配列をURLエンコードを行うコードを以下のように書いた場合、
$name = $_POST['name'];
$name_encoded = urlencode($name);
変数$nameには、送信された名前の配列が格納されますが、この配列がurlencode()関数に直接渡されるため、PHP Warningが発生します。
正しいコード
$name = $_POST['name'];
foreach ($name as $value) {
$name_encoded[] = urlencode($value);
}
foreach文を使用して配列の各要素を個別に処理し、urlencode()関数に渡すようにします。
例2:配列をURLクエリパラメータとして渡した場合
PHPで、配列をURLのクエリパラメータとして渡すことができます。ただし、その際には配列を文字列に変換する必要があります。文字列に変換せずに、そのままurlencode()に渡してしまった場合に、PHP Warningが発生することがあります。
//配列
$data = array(
'name' => 'Taro Yamada',
'email' => 'taro.yamada@example.com',
'hobbies' => array('reading', 'swimming', 'traveling')
);
//文字列に変換
$query_string = http_build_query($data);
$url = 'https://example.com/page.php?' . urlencode($query_string);
上記の場合、urlencode()関数に渡されるのは、文字列ではなく配列のため警告メッセージが発生します。
Warning: urlencode() expects parameter 1 to be string, array given in /path/to/file.php on line X
これを回避するためには、http_build_query()関数で文字列に変換し、urlencode()関数でURLエンコードを行った後、str_replace()関数を使用して、文字列中の%5Bと%5Dをそれぞれ[と]に置換します。
正しいコード
$query_string = http_build_query($data);
$url = 'https://example.com/page.php?' . urlencode($query_string);
$url = str_replace('%5B', '[', $url);
$url = str_replace('%5D', ']', $url);
警告を回避する方法
以上のようにPHP Warning: urlencode() expects parameter 1 to be string, array given in /wp-includes/formatting.php という警告メッセージは、urlencode()関数に配列が渡された場合に発生する警告です。
警告を回避するには配列を文字列に変換する必要があります。