2011-12-17 12 views
0

以下のコードで問題があります。問題を示すために簡略化されています。入力の名前は同じで、mysqlテーブルに複数の新しい行を作成する必要があるため、ループを使用します。問題は私が$ _POST ['name'] [$ i]を使用していて、テーブルが 'text?'と表示されないために受け入れられないということです。私は言ったように 、コードは大幅に簡素化されました。

for($i=0;$i<count($_POST['url']); $i++) { 
    $sql = 'INSERT INTO urls (url) VALUES ('. $_POST['url'][$i].')'; 
    if(!mysql_query($sql)) { 
    echo "error " . mysql_error(); 
    } 
} 

私はこれでrememdyしようとした -

$ sqlを= '"' $ _POST [ 'URL'] [$ i]を"。 "。 'のURL(URL)VALUES(。INSERT INTO'。 ')');

私はこれを行う場合、それは動作しますが、何のエラー

$sql = 'INSERT INTO urls (url) VALUES (' " hello " ')'; 

はありません、これは右、おそらく初心者のタイプミスでしょうか?これに助けてくれてありがとう。

+1

html

マークアップを投稿してください。 – adatapost

+2

あなたのコードはSQLインジェクションに対して脆弱です。私は主題を読んで、(少なくとも)mysql_real_escape_string()を使って値をエスケープしてから挿入することをお勧めします。 – kba

+0

'var_dump($ _ POST)'を実行して、動作していないクエリがあれば投稿してください。また、受け取ったエラーを投稿してください。 – kba

答えて

-2

は、あなたは、単に以下のようにMySQLのクエリで掲示される値を引用符で囲むを追加する必要があります

$sql = "INSERT INTO urls (url) VALUES ('". mysql_real_escape_string($_POST['url'][$i])."')"; 
+0

挿入する前の値にmysql_real_escape_string()を使用してください –

1

この文を試してみてください。また、あなたが入力をエスケープしていない場合、それは大規模なSQLインジェクションの脆弱性があります:MySQLはあなたのポストの値は引用符なしの数値であることを想定していると考えているので

$data = mysql_escape_string($_POST['url'][$i]); 
$sql = 'INSERT INTO urls (url) VALUES ("'.$data.'")'; 

クエリがMySQLを破ります。

+0

+1、私はこれをテストするまで、二重引用符をMySQLのテキスト区切り文字として使用できるかどうかわかりませんでした。 – cori

+0

通常は使用しないでください。私がこれを誤って覚えていない限り、ANSI SQLは 'は文字列区切り文字として使用されるものとします。 – Corbin

0

mysql_error()によって返された実際のエラーメッセージがわかりましたが、SQLのクエリに$ _POST値を指定していないと思っています。 $ _POST [ 'URLは']で確認すること

$urls = (isset($_POST['url']) && is_array($_POST['url'])) ? $_POST['url'] : array(); 
foreach($urls as $url) { 
    if(!is_string($url)) { 
     continue; 
    } 
    $sql = "INSERT INTO urls (url) VALUES ('" . mysql_real_escape_string($url) . "')"; 
    if(!mysql_query($sql)) { 
     echo "error " . mysql_error(); 
    } 
} 

$sql = "INSERT INTO urls (url) VALUES ('". mysql_real_escape_string($_POST['url'][$i]) ."')"; 
+0

meh - 私の前のコメントは愚かでした - 与えられたのは$ _POSTからですが、それは外部入力です。私自身の防衛では、エントリの編集を計画していましたが、@ rdloweryのコードをテストしていました。私はいつもMySQLで必須のテキスト区切り文字であるとみなしていました。反転のために – cori

+0

ありがとう! :) – cori

2

でクリーンな方法を(とエラーが固定されている)

$sql = 'INSERT INTO urls (url) VALUES ('. $_POST['url'][$i].')'; 

を交換してみてください配列は、非配列(または存在しないキー)を配列として扱うことを防ぎます。 is_stringは、サブ配列をスローしようとしているユーザからPHPを取得して、「文字列として配列を使用する」通知をスローすることを防ぎます。エスケープはSQLインジェクションを避けることであり、追加された一重引用符はMySQLが文字列であることを知るためのものです。

+0

配列として$ _POST ['urls']のための+1ガード。 – cori

+1

私はそれを「いいガード」とは考えていませんが、むしろ必要です。私は少しでも編集的な面でコードします:)。 – Corbin

0

$ _POST変数をSQL文で挿入する前に、好ましくはmysql_real_escape_string()関数を使用してSQL injection attacksに対してクエリを強化する必要があります。

+0

"prepared SQL statement"はあいまいです。 mysql_real_escape_stringはプリペアドステートメントでは使用されません。それはあなたが意味するものではないことを文脈から明らかですが、質問者にはあいまいかもしれません。 – Corbin

+0

また、 'mysql_real_escape_string()'は魔法の解決策ではないことに注意してください。まだいくつかの考慮事項があります。 'SELECT * FROM table LIMIT $ count'のようなクエリでは、エスケープでは不十分です。 ( 'intval()'はここで使用できます) – kba

+0

あなたはそうです。悪い言葉の選択。私は、文字列の部分と変数の連結から整理されているという意味で「準備」されていると思われますが、PDOのprepareメソッドを使用してSQLクエリを実際に準備することができます。私はここにいると思いますが、その言葉は最高で余計です。 – Aaron

0

回答はCorbinが役に立ちますが、ループ内で挿入クエリを実行しないようにしてください。

SQLクエリを1つの文字列として作成し、挿入クエリを1回起動できます。

からinsert文を変更して、テーブル(フィールド)値(1)に挿入することができます。 テーブル(フィールド)の値(1)に挿入します。

To: テーブル(フィールド)に値(1)、(2)、(3)、(4)を挿入します。

これはより最適な解決策です - しかし、mysqlはSQLステートメントをとることができる最大長を持っています。

関連する問題