2016-04-04 10 views
0

次のコードを使用して、フォームを処理し、イメージをMySQLデータベースに格納します。イメージをBLOBフィールドにアップロードしようとするとSQL構文でエラーが発生する

$name=htmlentities(stripslashes($_POST['fname'])); 
$pname=htmlentities(stripslashes($_POST['pname'])); 
$email=htmlentities(stripslashes($_POST['email'])); 
$phone=htmlentities(stripslashes($_POST['phone'])); 
$des=nl2br(htmlentities(stripslashes($_POST['description2']))); 
$cost=htmlentities(stripslashes($_POST['price'])); 
$category=htmlentities(stripslashes($_POST['category'])); 
$date=htmlentities(stripslashes($_POST['date22'])); 
$image=htmlentities(stripslashes($_POST['pic'])); 
$imagedata=file_get_contents($image); 

$query="INSERT INTO records 
VALUES('','$name','$pname','$email','$phone','$cost','$des','$category','$date','$imagedata');"; 

if ($connect->query($query) === TRUE) { 
echo "Inserted! <a href=\"display.php\">Click here to view database  records</a>"; 
} else { 
echo "Error: " . $connect->error; 
} 

私は、コードを実行すると、私はSQL構文で次のエラーを取得する:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ݤ‰;(IƒiHôBüŸ¤#Žø#&ad„„¹Ì’¼þý…dÀe‘'Ky÷ 𭉈˕¿ffµúßÄe%KÁ€DdѧÑÊÕÂRO÷' at line 2

私は列とそのBLOBをチェックしています。私は列の順序をチェックして、彼らは正常です。何がうまくいかないのか分かりません。

+1

シンプル:データをエスケープする必要があります –

+0

'htmlentities'と' stripslashes'はSQLインジェクションを防ぐために何もしません。 '$ _POST ['pic']'はあなたのシステム上のファイルの場所ですか? – chris85

+0

@ Fred-ii- mysqli_string_real_escape()を使用してエスケープすると、データベースに挿入することができました。しかし、次のように試してみてください。echo ''; – Arihant

答えて

1

イメージのコンテンツをエスケープする必要があります。

1)使用しているPHPのバージョンはマイナー・タントのPHP 5.5である場合は、「mysql_real_escape_stringの」機能を使用することができます。

はそれを達成するためにさまざまな方法があります。

$query="INSERT INTO records VALUES('','$name','$pname','$email','$phone','$cost','$des','$category','$date','" . mysql_real_escape_string($imagedata) ."');"; 

2)は、BASE64のコンテンツはファイルのサイズを大きくしようとしますが、使用することは非常に安全ですエンコーディング、「BASE64_ENCODE」機能を使って画像コンテンツをエンコードします。

$query="INSERT INTO records VALUES('','$name','$pname','$email','$phone','$cost','$des','$category','$date','" . base64_encode($imagedata) ."');"; 

ファイルを読み込んだりダウンロードしたりするときは、「base64_decode」関数を使用してコンテンツをデコードすることを忘れないでください。

3)画像は、「にstripslashes」機能で読み取るか、ダウンロードされたときにスラッシュを削除することを忘れないでください

$query="INSERT INTO records VALUES('','$name','$pname','$email','$phone','$cost','$des','$category','$date','" . addslashes($imagedata) ."');"; 

「にaddslashes」機能を使用して、二重と一重引用符をエスケープします。

+0

私はbase64_encodeを使用しました。しかし、今私はどのようにファイルを表示するのですか?私は試みた: エコー ''; これは動作しません – Arihant

+0

あなたはbase64_decodeでコンテンツをデコードしました。私はあなたのWebブラウザをオーバーロードする可能性があり、おそらく一部のWebブラウザでは動作しないため、base64メソッドを使用してHTMLでファイルストリームを直接書き込むことはお勧めしません。 –

+0

次のように変更しました: echo ''; いいえ – Arihant

関連する問題