1

私はまだphpの初心者で、ここで何が問題なのか理解できないようです。「識別されていないインデックス」エラーがあっても、コードは機能します。私が得るエラーは、変数 $food、$calories、$healthy、$submit を参照することです。

コードは次のとおりです。

<?php

require 'connect.inc.php';

$foodname = $_POST['food_name'];
$calories = $_POST['calories'];
$healthy = $_POST['healthy_unhealthy'];
$submit_button = $_POST['submit'];

$sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";

if(isset($submit_button)&&!empty($foodname)&&!empty($calories)&&!empty($healthy))
{
    mysql_query($sql, $conn);
}
else{
echo'Kindly fill in fields';
}

?>
<form action="insert.php" method="POST">
Food Name:<br>
<input type="text" name="food_name"><br>
Calories:<br>
<input type="text" name="calories"><br>
Healthy:<br>
<input type="text" name="healthy_unhealthy"><br>
<input type="submit" name="submit">
</form>
4

6 に答える 6

3

何よりもまず、データを受け入れるのに適切な状態にあることを確認してください。コードを次のようにラップします。

<?php

require 'connect.inc.php';

// We only run this code if the user has POSTed data to this page. Without this we 
// will get an 'undefined index' error.
if(isset($_POST['submit'])) {
    $foodname = $_POST['food_name'];
    $calories = $_POST['calories'];
    $healthy = $_POST['healthy_unhealthy'];
    $submit_button = $_POST['submit'];

    $sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";

    if(isset($submit_button)&&!empty($foodname)&&!empty($calories)&&!empty($healthy))
    {
        mysql_query($sql, $conn);
    }
    else{
        echo'Kindly fill in fields';
    }
}

?>
<form action="insert.php" method="POST">
Food Name:<br>
<input type="text" name="food_name"><br>
Calories:<br>
<input type="text" name="calories"><br>
Healthy:<br>
<input type="text" name="healthy_unhealthy"><br>
<input type="submit" name="submit">
</form>

これにより、定義したフォームから現在 POST リクエストを受信して​​いることを確認できます。

$_POST 変数は、POST 要求を介して Web アプリケーションに送信したデータを含む配列です。フォームには、適切な名前 (food_name、calal、healthy_unhealthy など) のフィールドが必要です。これらのフィールドが欠落しているようです。

コードの上部近くに、次のように記述します。

print_r($_POST);

または、代わりに次のこともできます

var_dump($_POST);

これにより、 $_POST 変数の内容が出力されます。food_name、calalar、healthy_unhealthy への参照が表示されない場合は、フォームが正しく、これらの変数が Web アプリケーションに渡されていることを確認してください。

于 2013-09-16T19:18:19.783 に答える
2

ur phpにラッパーを入れてみてください...次のように:

if (isset($_POST['submit'])) {
    //code here....
}

フォームを次のように変更します。

<form action="" method="POST">

デバッグするには..これを使用します:

var_dump($toDebug);
于 2013-09-16T19:18:52.103 に答える
1

初めてページを読み込むと、未定義のインデックス エラー メッセージが表示されます。

エラーを修正するにはisset()、フォームが実際に送信されたかどうかを使用して確認します。

if(isset($_POST['submit'])) { 
print_r($_POST); //to see all the form inputs
// your code ...

}

変数が設定されているかどうかも確認します。

$foodname = (isset($_POST['food_name'])) ? $_POST['food_name'] : NULL;
$calories = (isset($_POST['calories'])) ? $_POST['calories'] : NULL;
$healthy = (isset($_POST['healthy_unhealthy'])) ? $_POST['healthy_unhealthy'] : NULL;

無関係な補足: あなたのコードは SQL インジェクションに対して脆弱です。変数を MySQL クエリに直接挿入する代わりに、最初に を使用して次mysql_real_escape_string()のようにエスケープします。

$foodname = mysql_real_escape_string($foodname);
$calories = mysql_real_escape_string($calories);
$healthy = mysql_real_escape_string($healthy);

これにより、SQL インジェクションを防ぐことができます。いっそのこと、mysql_*関数の使用を停止します。それらはもはや保守されておらず、公式に非推奨です。代わりに準備済みステートメントについて学び、 PDOまたはMySQLiを使用してください。

修正すると、コードは次のようになります。

if(isset($_POST['submit'])) 
{
    /* form was submitted, proceed */

    $submit_button = $_POST['submit'];

    /* checking if user inputs are set */
    $foodname = (isset($_POST['food_name'])) ? $_POST['food_name'] : NULL;
    $calories = (isset($_POST['calories'])) ? $_POST['calories'] : NULL;
    $healthy = (isset($_POST['healthy_unhealthy'])) ? $_POST['healthy_unhealthy'] : NULL;

    /* escaping user inputs */
    $foodname = mysql_real_escape_string($foodname);
    $calories = mysql_real_escape_string($calories);
    $healthy = mysql_real_escape_string($healthy);

    //query
    $sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";

    /* storing query result to a variable */
    $result = mysql_query($sql, $conn);

    if($result) 
    { 
        //do stuff
    } 
    else 
    {
        die(mysql_error()); //display error, and exit
    }
}

お役に立てれば!

于 2013-09-16T19:18:57.010 に答える
1

PHP では、未定義または未宣言の変数を使用できます。宣言されていない変数を参照すると、この通知が表示されます。

識別されていない変数が検出されると、推定された型のデフォルトの「ゼロ」値が使用されます。数値の場合は 0、文字列の場合は空の文字列。

あなたの場合、$_POST変数には値が入力されておらず (フォームを POST することによって入力されます)、未確認の変数ごとに通知が表示されます。

詳細については、次のドキュメントを参照してください。

PHP で変数を初期化する必要はありませんが、非常に良い方法です。初期化されていない変数には、使用されるコンテキストに応じた型のデフォルト値があります。ブール値のデフォルトは FALSE、整数と浮動小数点数のデフォルトはゼロ、文字列 (echo で使用されるなど) は空の文字列として設定され、配列は空の文字列になります。配列。

これが賢明な言語設計上の決定であるかどうかは、私自身に任せます。

于 2013-09-16T19:22:23.617 に答える
0

あなたはこのコードを持っています

$sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";

if(isset($submit_button)&&!empty($foodname)&&!empty($calories)&&!empty($healthy))
{
    mysql_query($sql, $conn);
}

ここで、これらの変数をifステートメントの外で使用していて、初めて使用できないため、使用できます ($sql変数は if ステートメント内に入力する必要があります)

if( isset($_POST['submit']) && (!empty($foodname) && !empty($calories) &&!empty($healthy)) ) { 
    $sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";
    mysql_query($sql, $conn);
}

また、(より良い)を使用できます

if( isset($_POST['submit']) ) { 
    $foodname = $_POST['food_name'];
    $calories = $_POST['calories'];
    $healthy = $_POST['healthy_unhealthy'];
    if( !empty($foodname) && !empty($calories) && !empty($healthy) ){
        $sql="INSERT INTO `food` (`food`, `calories`, `healthy_unhealthy`) VALUES('$foodname', '$calories', '$healthy')";
        mysql_query($sql, $conn);
    }
}
于 2013-09-16T19:24:03.850 に答える
0

Unindentified indexはエラーではなく、通知です。スクリプトは停止しないため、続行されます。

$_POST-変数が空である可能性があることに注意してください。これが、この通知が表示される原因です。これ自体は問題ではありませんが、SQL ステートメントでこれ (適切に初期化されていない変数) を引き続き使用すると、適切に処理しないと問題が発生する可能性があります。

デバッグ目的で、var_dump($_POST);何が入っているかを簡単に確認してください。

isset()次のような関数を使用してこれを回避できます。

if (isset($_POST['food_name'])) {
    //do something here
}

私はできる限り変数を初期化する傾向があります。次のようにします。

$food_name = (isset($_POST['food_name'])) ? $_POST['food_name'] : '' ;

これは、より問題のある問題、つまり SQL セキュリティにつながります。このようにコーディングすると、スクリプトは SQL インジェクション攻撃を受けやすくなります。

このトピックに関する 2 つのアドバイス:

  • mysql 拡張機能は使用しないでください。代わりにmysqliまたはpdo:mysqlを使用してください。
  • 変数を使用する前にサニタイズしてください (pe を使用するmysqli_real_escape_stringか、さらに良いのは、準備されたステートメントで作業することです。
于 2013-09-16T19:26:49.020 に答える