1

次のhtml送信フォームがあります。このフォームは PHP_SELF であり、入力データを配列として $_POST に格納します。

<html>
<body>
<form method="post" action="<?php echo htmlentities($PHP_SELF); ?>">
<fieldset>
<legend>Direct Bill Information:</legend>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" />
</fieldset>
<input type="submit" value="submit" name="submit" />
</form>
</body>
</html>

「db_num」フィールドと「db_amnt」フィールドを持つ MySQL テーブルがあり、配列内のすべての入力データをテーブルに挿入したいと考えています。私は周りを見回しましたが、「内破」が最良の方法のようですが、多くの調査の結果、まだ機能させることができません。PHP 全体が実行され、エラーなしで終了しますが、両方の列の 10 行すべてを表示する代わりに、すべてのエントリの値が 0 の 2 つの列のうち 2 行を表示するだけです。これは私が使用しているコードです:

$sql2 = array();
foreach($_POST as key=>$value)
{
    if(key != 'submit')
    {   
        if($value != '')
        {   
            $sql2[] = '("'.mysql_real_escape_string($value['db_num']).'", "'.$value['db_amnt'].'")';
        }   
    }
}
mysql_query('INSERT INTO ' .$tablename_db. '(db_num, db_amnt) VALUES '.implode(',', $sql2)); 

少しデバッグして、foreach ループで $value をエコーし​​たところ、3 つの用語しか表示されていないことがわかりました。「配列」、「配列」、および「送信」。さらにチェックすると、送信フォームから値を取得して表示する唯一の方法は、$_POST だけでなく、$_POST[db_num] と $_POST[db_amnt] を介して foreach ループを実行することであることがわかりました。なぜこれを行っているのか、それを修正する方法はよくわかりません。これは PHP での最初のコードであり、学習しながら学んでいます。私が得ることができるどんな助けにも本当に感謝しています!

4

2 に答える 2

1

これを試して

$db_num = $_POST['db_num'];
$db_amnt = $_POST['db_amnt'];

$items = array_combine($db_num,$db_amnt);

$pairs = array();

foreach($items as $key=>$value){
  $pairs[] = '('.intval($key).','.intval($value).')';
}

mysql_query('INSERT INTO ' .$tablename_db. '(db_num, db_amnt) VALUES '.implode(',',$pairs));
于 2012-07-30T12:00:40.963 に答える
0

送信すると、HTML フォームは次の$_POST配列を生成します (いくつかのサンプル値を作成します)。

$_POST = [
    'db_num' => ['1', '2',  '3',  '4',  '5',  '6', '7', '8', '9', '10'],
    'db_amnt' => ['100', '125', '150', '175', '200', '225', '250', '275', '300', '325']
];

言い換えれば、をずっと$_POST['db_num']持っていることになります。同様に、will hold 、will holdなどです。ユーザーがいずれかのフィールドへの入力に失敗した場合でも、空のフィールドが送信され、値は幅ゼロの文字列 (空の文字列) になります。$_POST['db_num'][0]1$_POST['db_num'][9]10$_POST['db_amnt'][0]100$_POST['db_amnt'][1]125

フォーム データを構造化して、このようなクリーンですぐに使用可能/トラバース可能なデータ セットを提供することで、あなたは素晴らしいサービスを提供しました。

入ってくるデータを再構築する必要はありません (使用するブードゥー教の提案にもかかわらずarray_combine())。余分な作業が必要な場合は、フォームの各行から「対になった」値を検証することをお勧めします。たとえば、特定の行のdb_numとの両方db_amntが空でない場合にのみデータを保存する必要があると想定しているため、提案されたスニペットにそのチェックを組み込みます。

$conn = new mysqli($server, $user, $password, $database);
$stmt = $conn->prepare("INSERT INTO {$tablename_db} (db_num, db_amnt) VALUES (?,?)");
$stmt->bind_param("ii", $num, $amnt);  // name the two variables which will pass integer values where the ?'s are located
foreach ($_POST['db_num'] as $index => $num) {
    $amnt = $_POST['db_amnt'][$index];
    if (strlen($num) && strlen($amnt)) {
        $stmt->execute();  // only INSERT qualifying rows
    }
}

db_amnt値に小数点以下の桁数がある場合 (浮動小数点数)、へibind_param()呼び出しで を変更できることに注意してくださいd。すべての値を (文字列) として宣言する最も単純な方法を好む人もいますsが、予測可能なユーザー入力を処理する場合は、それを抑えるのが好きです。

これは反復テクニックのデモンストレーションです

他の検証チェックがある場合は、それらをif式に追加してください。

個々の成功チェックを楽しみたい場合はexecute()、影響を受ける行を参照するためにすぐ下に何かを書くことができます。

プリペアド ステートメントの再利用は、このプロセスを mysqli で実行する必要がある 2 つの方法のうちの 1 つです。もう 1 つは、すべての行を含む 1 つの包括的な INSERT クエリを作成することですが、それにはもう少し準備が必要です。これら 2 つの mysqli 手法は、インジェクションに対して安全で、安定しており、効率的です。

最後に、一部の開発者は、サブ配列にアクセスする前に、各インデックスが実際にサブ配列に存在するかどうかを確認する必要があると言うでしょう。他の開発者は、HTML を故意にハッキングしているユーザーによって生成された通知を処理する必要はないと主張しています。isset()反復の前と反復中に呼び出しを行うかどうかの判断は、個々の研究者に任せます。

于 2020-01-02T05:32:50.783 に答える