2012-01-13 13 views
1

MySQLデータベースに入力する一部のフィールドを送信するスクリプトがありますが、これを送信すると正常に処理されますが、フィールドの1つにアポストロフィが含まれているとデータベースに挿入されることはありません。これを動作させるには何が変更できますか?アポストロフィの問題

if ($_POST) { 
$name = trim($_POST['your_name']); 
$email = trim($_POST['your_email']); 
$answers = $_POST['answers']; 
$i = 0; 
foreach ($answers as $a) { 
    if (trim($a)) 
     $i++; 
} 

if ($name && $email && $i >= 40) { 
    $array = array(); 
    $q = mysql_query("select * from fields"); 
    while($f = mysql_fetch_array($q)) 
     $array[$f['label']] = $answers[$f['ID']]; 

    $array = serialize($array); 
    $time = time(); 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $token = md5($time); 

    $result = mysql_query("insert into data (submit_name, submit_email, submit_data, submit_confirm, submit_time, submit_ip, submit_token) 
     values ('$name', '$email', '$array', '0', '$time', '$ip', '$token')"); 
+2

これはPHPからmysql_query関数が削除されている可能性があるためです。できるだけ**常に** **常に、[prepared statements](http://php.net/manual/en/pdo.prepared-statements.php)を使用してください。あなたは、ユーザーが入力したテキストをSQLに直接置く必要はありません。 – tadman

+2

コアデベロッパーチームは必然的にmysql/mysqliを殺したいと思っていますが、**かなり多くの古くなった**チュートリアルがネット上にあり、**既存のゴミコードを壊すでしょう**。 – rdlowrey

+1

私はここでMySQLタグをより頻繁に見てきました。私は盲目的に無知な人々がSQLをエスケープする方法について、本当に恐ろしいです。それは彼らがそれを言うことを気にしないようなものです。ただの世界では、このようなコードを書くことは**資本犯罪**です。 – tadman

答えて

0

mysql_real_escape_string()を使用してください。これはアポストロフィの問題を修正し、少なくとも部分的にSQLインジェクション攻撃を回避するためです。 PHPの組み込みPDOライブラリを手に入れたくない場合は、DBAL(Database Abstraction Layer)を検討してください。 ADODBがその例です。

+0

私のスクリプトのどこにポインタを置くべきでしょうか?申し訳ありませんが、私はここの騒ぎで、私はこのスクリプトを誰かが最初に書いていました。 – techora

+0

@kcray:クエリに追加する前に、ユーザーが指定したすべての文字列をその関数でラップします。 – Crontab

+0

数分ありますか?あなたは本当に素早く私に連絡することができますか? impactfactor1 [at] gmail [dot] com – techora

3

escape characters with special meaning in MySQL in your dataが必要です。

あなたのコードを改善するために迅速かつ汚いの方法は、SQLのあなたの文字列にそれらを挿入する前mysql_real_escape_stringを通じて、すべての文字列を渡すことであろう。

より良いアプローチは、mysql_queryからbound parameters (preferably with prepared statements)の使用を可能にするものに切り替えることです。

+0

PHP用の単純なスタンドアロンのORMはありますか、それともCakePHPやCodeIgniterのようなものにすべてバンドルされていますか? – tadman

+0

私は驚いていましたが、私は知らないのでPHPを避けようとしています。 – Quentin

+0

私のスクリプトのどこにポインタを置くべきでしょうか?申し訳ありませんが、私はここの騒ぎで、私はこのスクリプトを誰かが最初に書いていました。 – techora

関連する問題