2011-08-16 7 views
0

朝の消毒、SO INSERTクエリのPOSTアレイ

私は(それが複数を含むことができる、現在、6つの値を含むフォームのチェックボックス配列(名前は=「猫[]」)を有する1- 6将来は)。ユーザはこれらの任意の数を選択することができる。

これらの値は、その後に回収されています。私は何をしたいか

はそれらをサニタイズされ(ステップまたは2は、実際のINSERTクエリの前にありますので、彼らがセッションにいる)

$_SESSION['cat'] = $_POST['cat']; 

。私は試しました

$_SESSION['cat'] = (int)$_POST['cat']; 

しかし、それはそれからすべての値を削除するようです。

データベースへの安全な挿入のために、これを適切な方法で丁寧に手助けできる人はいますか?いつものように

事前のおかげでは、 ダン

+1

のような値とは何ですか?彼らはすべて数字ですか?あなたはどうやってそれらを浄化するのですか?あなたが求めているところでは、配列にキャストしているように見えます( 'cat []')。これは整数の配列にならず、整数になります。 – DaveRandom

+0

こんにちはDave、配列には6つの値(1つ、2つ、3つなど)が含まれています。これらはtoxiソリューションの一意のIDに関連しています私のデータベースのタグのために。これは現時点で素晴らしいですが、それを浄化する(またはしようとする)ことは、それを止めました。私の挿入クエリでは、それらをすべてループします。 – Dan

+0

(参考):[php filter functions](http://www.php.net/manual/ref.filter.php)、特に[filter_input_array](http://www.php.net/ manual/efunction.filter-input-array.php) – Yoshi

答えて

1

シンプルなソリューション

$values = array_map('intval',$_POST['cat']); 

しかし、それはむしろそれを削除するよりも、0に置き換え、すべての非整数値になります。あなたは二重の保護を持っています

$stmt = $pdo->prepare("*your query with params replaced with ?*"); 
foreach ($_POST['cat'] as $cat){ 
    //check that $cat is integer. 
    if ($cat === 0 || (!empty(intval($cat))) 
     $stmt->execute(array($cat)); 
} 

この方法:

はるかに良い解決策は、このように、(私は:) ... MySQLの挿入については、各記事でそれを伝えるために疲れている)prepared statmentsを使用しています:あなたはint yorselfをチェックし、PDOはSQL文で正しく使用します。

+0

ハハ、誰もが私にPDOを使用するように言っているが、私はちょうどこれの周りに私の頭を上げているので、私は離れてshy離れて!私は私が飛び込んであなたのことを行っていると思うジョン、ありがとう:) – Dan

+0

Hehe、ちょうどあなたの決定を妨害する:[新しいmysqlエンジンは準備文とオブジェクト指向のスタイルもサポートしています](http://www.php .net/manual/en/mysqli.prepare.php) – J0HN

0

あなたは整数としてすべてを意味し、安全とした場合:

エルス
foreach ($_POST['cat'] as $key => $value) { 
    $_SESSION['cat'][] = int()$value; 
} 

、あなたはmysql_real_escape_string($value)int()$valueを置き換えることができます。

固定タイプミス

+0

私はreal_escape_stringデベロッパーを試しましたが、それはちょうどすべての値も取り除くように見えました(数字1-6)。それらはすべて整数でなければなりません。私はちょうど彼らが挿入のために安全であることを確認したいです。 – Dan

+0

配列全体をサニタイズするので、それらはすべて空になります。だからこそ、私はforeachループを使って一つずつそれを浄化しています。 intの代わりにmysql_real_escape_stringも使用する必要があります。 – Devator

+0

そのコードはポストの*変数をint型にキャストし、$ _SESSION ['cat']に追加します。 – J0HN

0

$_POST['cat']は、値のどのような種類がありますか?私はあなたがと仮定しています。は整数ですが、そうでなければ、intにキャストされるとゼロを吐き出します。

HTMLのvalue=""に実際に整数が含まれていることを確認してください。私はチェックボックスのHTMLなしでもっと多くを言うことができません。

+0

申し訳ありませんが、各チェックボックスの値は '1'、 '2'、 '3'などです。私はちょうど彼らが安全であることを確認したいと思います。 – Dan

+0

キャストからintへの何も取得していないことが不思議です。あなたの質問に答えるために、はい、intへのキャストは完全に安全です。その他のもの(文字など)は除外されます。 – Bojangles

0

mysql_real_escape_stringを使用すると、文字列がSQLエラーを生成しないことを確認してから、文字列から整数値を取得する関数intvalを使用できます。

0

PHP:

if ($_POST['submit']) { 
    foreach ($_POST['cat'] as $key => $value) { 
     $_SESSION['cat'][] = intval(mysql_real_escape_string($value)); 
    } 
} 

if (isset($_SESSION['cat'])) { 
    foreach($_SESSION['cat'] as $cat) { 
     echo "Cat: $cat<br />"; 
    } 
} 

HTML:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 
    1 <input name="cat[]" type="checkbox" value="1" /><br /> 
    2 <input name="cat[]" type="checkbox" value="2" /><br /> 
    3 <input name="cat[]" type="checkbox" value="3" /><br /> 
    <input type="submit" value="submit" name="submit" /> 
</form> 
+0

こんにちはマット、これも動作しますが、何らかの理由で値が2回返されています。つまり、私が1,3,5を選択した場合、1,3,5,1,3,5 – Dan

+0

がなぜそれが起こるのか分かりません。使用しているHTMLとPHPコードを見ることは可能でしょうか?他の場所で$ _SESSION変数を変更しますか? – Mat

+0

こんにちはマット、上記の 'プレビュー'ページには、実際の挿入ページに私が持っている:foreach($ cat as $ item){$ sql = "query"; $ result = mysql_query($ sql);}私はそれをまったく変更していないことがわかります – Dan