【PHP】Notice: Undefined indexエラーの原因と対処法

php-prograshi(プロぐらし)-kv PHP
記事内に広告が含まれていることがあります。

【PHP】Notice: Undefined indexエラーの原因と対処法

phpのフォームで送信後に以下のエラーが表示された場合。

Notice: Undefined index

原因

フォームのデータ受け取りがうまくいっていない。
inputタグのname属性に空白を含んだ値をセットしていた。

name属性は空白で設定できるが、post(またはget)送信後、空白がアンダースコア「_」に置き換わる。

$_POST[]のname属性の指定を、アンダースコアなしの値で呼び出していたためエラーが発生。

対処法

下記2パターンで対応可能。

①nameの設定に空白を使わない。
$_POST[]で受取時に空白を「_」に置換した値をセットする。


PHPの処理

エラー

インスタンス生成時に名前の部分に空白を含んだ値をセットしていた。

<?php

//クラスの設定
class Product{
    //nameプロパティ(カプセル化)
    private $name;

    //コンストラクタ
    public function __construct($name){
        $this->name = $name;
    }

    //ゲッター
    public function getName(){
        return $this->name;
    }
}

//インスタンスの生成(空白を含む値)
$applewatchBK = new Product('apple watch black');
$applewatchW = new Product('apple_watch_white');

//array定義
$products = array($applewatchBK, $applewatchW);

?>   
<form action="confirm.php" method="post"> 

<!-- foreachで配列の値をひとつずつ取り出す -->
 <?php foreach ($products as $product): ?>

    <!-- name属性にnameプロパティの値をセット -->
    <input type="text" value="0" name="<?php echo $product->getName() ?>">
    <span>個</span>
 <?php endforeach ?>

<input type="submit" value="送信">
</form>
<?php foreach ($products as $product): ?>

 <!-- POSTはgetName()で表示 -->
 <?php $orderCount=$_POST[$product->getName()] ?>
    <?php echo $product->getName() ?>
    :
    <?php echo $orderCount ?>

取得時のname属性にgetNameを指定。

<input type="text" value="0" name="<?php echo $product->getName() ?>">

name=apple watch black

同様にPOSTでgetNameを指定。

<?php $orderCount=$_POST[$product->getName()] ?>

name=apple_watch_black

一致しないためエラー表示となる。

修正

・空白を使わない
 └ インスタンスの値は空白を「_」に置換。
・空白ありの値を呼び出すために別途ゲッターをセット

<?php
class Product{

    //ゲッターを追加(str_replaceメソッドで置換)
    public function getSpaceName(){
        return str_replace("_"," ",$this->name);
    }

//空白をアンダースコアに置換
$applewatchBK = new Product('apple_watch_black');
$applewatchW = new Product('apple_watch_white');

}
?>   
<?php foreach ($products as $product): ?>

 <?php $orderCount=$_POST[$product->getName()] ?>

    <!-- 空白ありで呼び出したい場合は、新たにセットしたゲッターを使用 -->
    <?php echo $product->getSpaceName() ?>
    :
    <?php echo $orderCount ?>

受け渡し前後のname属性が一致するためデータ取得できる。

タイトルとURLをコピーしました