2

選択ボックスがあり、ループしてデータベースに追加したいと考えています。私には正しいように見えますが、データベースには入りません。

<select name="countylist" style="height:300px;" class="multiple" multiple="multiple" id="box2View">
      <option value="11">Beer Gardens</option><option value="10">Historic Bars</option>           
      <option value="8">Live Music</option><option value="1">Night Clubs</option>
      <option value="4">Pubs Serving Food</option><option value="6">Sports Bars</option>      
 </select>

SQL:

foreach($_POST["countylist[]"] as $s) {  
  $insertSQL = sprintf("INSERT INTO cat_pubs (pub_id, cat_id) 
  VALUES(LAST_INSERT_ID(),". $s . ")");

  mysql_select_db($database_localhost, $localhost);
  $Result1 = mysql_query($insertSQL, $localhost) or die(mysql_error());
}  

ありがとう

4

5 に答える 5

3

[]次のように配列マーカーを含めるには、select の名前を調整する必要があります。

<select name="countylist[]"...

次に、PHP で次のように配列マーカーを削除します。

foreach($_POST["countylist"] as...

非常に重要なことは、PHP では、入力が実際に許可された値の 1 つであり、ユーザーが悪意を持って入力したものではないことを確認することです。選択の場合、許可された値の配列を保持してから、これをチェックするのが最も簡単な場合があります。

if(!in_array($s, $allowed_counties)) { /*false input, do not save in db*/}
于 2012-04-25T16:49:12.017 に答える
2

選択タグの名前をに変更してcountylist[]、PHPが配列を表していることを認識できるようにする必要があります。

<select name="countylist[]"/>
于 2012-04-25T16:43:20.793 に答える
1

いくつかのポインター、値が配列であることを POST に伝える必要がありname="countylist[]"ます。それ以外の場合は、php で最後に選択された値のみを取得します。

また、複数の挿入を行う場合は、結果を反復して各反復で挿入するよりも、挿入用の単一のクエリを作成する方が常に高速です。

また、間違っている各反復でデータベースを選択します。

<?php 
//connect
mysql_connect('localhost','user','pass');
//select your db
mysql_select_db('database');

//is posted
if($_SERVER['REQUEST_METHOD']=='POST'){
    //build query for a single insert
    $query = 'INSERT INTO cat_pubs (pub_id, cat_id) VALUES ';
    foreach($_POST["countylist"] as $s) {
        $query .='("","'.mysql_real_escape_string($s).'"),';
    }
    //trim the last ,
    $query = rtrim($query,',');
}

//do query
$result = mysql_query($query) or die(mysql_error());

?>

<form method="POST" action="">
  <!-- tell POST that countylist is an array --> 
  <select name="countylist[]" style="height:300px;" class="multiple" multiple="multiple" id="box2View">
      <option value="11">Beer Gardens</option>
      <option value="10">Historic Bars</option>           
      <option value="8">Live Music</option>
      <option value="1">Night Clubs</option>
      <option value="4">Pubs Serving Food</option>
      <option value="6">Sports Bars</option>      
 </select>

  <p><input type="submit" value="Submit"></p>
</form>
于 2012-04-25T16:59:53.743 に答える
1

あなたはそれで何をしようとしていLAST_INSERT_ID()ますか?

  • 今参照しようとしている前に挿入を行いましたか?

その場合、最初の (新しい) 挿入後に上書きされるため、値を変数に格納します。

  • 挿入に次の自動インクリメントを実行させようとしていますか?

次に、挿入で列に名前を付けないか、値に NULL を入れないでください。

INSERT INTO cat_pubs (cat_id)   VALUES(". $s . ")");

PS:そのような文字列から SQL を構築して、POST から直接 DB にデータを挿入すると、MySQL インジェクションによってハッキングされます文字列をエスケープするか、準備済みステートメントを使用します...

于 2012-04-25T16:40:05.910 に答える
0

例としてはOKです。1つの発言があります。

のように mysql_real_escape() を使用します

$insertSQL = sprintf("INSERT INTO cat_pubs (pub_id, cat_id) VALUES(LAST_INSERT_ID(),". mysql_real_escape_string($s) . ")");
于 2012-04-25T16:40:02.640 に答える