0

予約語を含む配列を挿入しようとすると問題が発生します。

私が言うかもしれないそれは本当に奇妙です、見てください:

$sql="INSERT INTO sites (cat_id, cat_title, cat_parent, title, image, site_name, description) VALUES ('$_POST[cat_id]','$_POST[cat_title]','$_POST[cat_parent]','$title','$image','$site_name','$description')";

配列は、私が作成した opengraph fetch から取得されますが、重要ではありません。問題は、配列 $title や $image に「use」などの予約語が含まれていると、SQL がエラーを返すことがあることです。エラー: SQL 構文にエラーがあります。対応するマニュアルを確認してください...."

そういうわけで:

配列 $title = http://techcrunch.com/2012/08/28/flipboard-hits-20-million-users-3-billion-flips-per-month/ <---- 機能しない場合上記のエラーが表示されます。

配列が $title = http://techcrunch.com/2012/08/27/google-nexus-7-is-now-available-in-france-germany-and-spain/の場合<---- 動作します大丈夫!

おそらく、エラーを返す配列 $title (または私が使用している他の配列) に「予約語」があるためだと思います...したがって、このエラーから配列を保護できる方法はありますか? ?

ありがとう!:)


編集:

解決

Ok!@dystroy と @tadman のアドバイスに従い、通常の mysql 接続の代わりに PDO を使用しました... SQL インジェクションや攻撃に対して完全に安全かどうかはわかりませんが、予約語の問題は解決します。これで、$array にあるコンテンツをデータベースに挿入できます。

誰かが同じ問題でここにたどり着いた場合、それが私がしたことです(何か気まずいところがあれば文句を言ってください):

$dbh = new PDO("mysql:host=MYHOST;dbname=MYDATABASE", "USER", "PASS");

$query = "INSERT INTO sites (cat_id, cat_title, cat_parent, title, image, site_name, description) VALUES (:cat_idpost, :cat_titlepost, :cat_parentpost, :titlepost, :imagepost, :site_namepost, :descriptionpost)";

$stmt = $dbh->prepare($query);

$stmt->bindParam(':cat_idpost', $cat_id);
$stmt->bindParam(':cat_titlepost', $cat_title);
$stmt->bindParam(':cat_parentpost', $cat_parent);
$stmt->bindParam(':titlepost', $titlepost);
$stmt->bindParam(':imagepost', $imagepost);
$stmt->bindParam(':site_namepost', $site_namepost);
$stmt->bindParam(':descriptionpost', $descriptionpost);

$cat_id = $_POST['cat_id'];
$cat_title = $_POST['cat_title'];
$cat_parent = $_POST['cat_parent'];
$titlepost = $title;
$imagepost = $image;
$site_namepost = $site_name;
$descriptionpost = $description;
$stmt->execute();

君たちありがとう!:D

4

2 に答える 2

1

データベースに文字列を挿入するには、必ず準備済みステートメントを使用してください。それらを単純に連結しないでください。

問題は予約語だけではなく、特殊な値や文字によるあらゆる種類のエラー (または攻撃) です。これをすべて自分でエスケープしようとしないでください。準備されたステートメントを使用すると、データベースがそれを処理します。

PHP/MySQL ( PDO )の今日の推奨ライブラリに基づいたこれらのサンプルを見てください: http://www.php.net/manual/en/pdo.prepared-statements.php

于 2012-08-28T19:07:21.343 に答える
-1

アクセント付きのタイトルなどの予約語をエスケープする

于 2012-08-28T19:10:35.397 に答える