web-dev-qa-db-ja.com

Mysql + php( '(アポストロフィ)や "(引用符)などの特殊文字

私はしばらくの間、小さな問題に悩んでいます。それは何年もそこにありましたが、それは単に苛立たせる問題であり、深刻な問題ではありませんでした、そして私はちょうどそれを回避しました。しかし、今私は誰かが私を助けることができるかどうかを知りたいです。私はいくつかグーグルをやっていますが、成功していません。

次のようなphpファイルのhtml textareaからフォーム投稿を行う場合:

<form action="http://action.com" method="post">
<textarea name="text"><a href="http://google.com">google's site</a></textarea>
</form>

もちろん送信ボタンなどもあります。

値は問題です:<a href="http://google.com">google's site</a> textareaの値には、 "(引用符)と '(アポストロフィ)の両方があります。

これをmysql_databaseに保存するには、次のようにします。

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".$_POST['text']."') ") or die(mysql_error());

そして今、私はmysqlエラーを受け取ります:

SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、「の近くのサイト」を使用するための正しい構文を1行目で確認してください

10

あなたのSQL文字列は次のようになります:

INSERT INTO `table` (`row1`) VALUES ('google's site')

これは有効なステートメントではありません。 Nanneが書いたように、少なくともmysql_real_escape_stringで文字列をエスケープします。 http://php.net/manual/en/function.mysql-real-escape-string.php

SQLインジェクションについて読む http://en.wikipedia.org/wiki/SQL_injection

少し考えてみてください。誰かがこれを投稿した場合:$_POST['text']、値:');delete from table;....

あなたはあなたのデータに別れを告げることができます:)

常に入力のフィルタリング/エスケープ!

編集:現在PHP 5.5.0 mysql_real_escape_stringとmysql拡張は非推奨です。代わりにmysqli拡張とmysqli :: escape_string関数を使用してください

19
Peter Porfy

ユーザー指定の値をデータベースに追加するときは、常に少なくともmysql_real_escape_stringを使用してください。クエリが次のようになるように、バインディングパラメータまたはmysqliを調べる必要があります。

INSERT INTO `table` (`row1`) VALUES (?)

そして?入力をサニタイズした後、実際の値に置き換えられます。

あなたのケースで使用してください:

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".mysql_real_escape_string($_POST['text'])."') ") or die(mysql_error());

SQLインジェクションについて読んでください。できるだけ早く行う価値があります!

9
methodin
3
Nanne

addlashes()関数を使用できます。スラッシュで文字列を引用します。そのため、フィールドにアポストロフィを追加する場合に非常に役立ちます。

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".addslashes($_POST['text'])."') ") or die(mysql_error());
2
Hemi

古いmysql *関数を使用する代わりに、PDOを使用してパラメーター化されたクエリを記述します- http://php.net/pdo

1
Stephen

Mysqlでデータを更新しているときにも、文字について苦労していました。

しかし、私はようやくより良い答えに到達しました、ここに:

$lastname = "$_POST["lastname"]"; //lastname is : O'Brian, Bran'storm

また、データベースを更新する場合、MySQL REALエスケープ文字列を使用しない限り、システムはデータベースを更新しません。ここに:

$lastname = mysql_real_escape_string($_POST["lastname"]);  // This Works Always.

その後、クエリは確実に更新されます。

Example: mysql_query("UPDATE client SET lastname = '$lastname' where clientID = '%"); //This will update your data and provide you with security.

詳細については、 MYSQL_REAL_ESCAPE_STRING を確認してください

お役に立てれば

0
Micheal P.

準備されたステートメントを使用するだけで、エスケープやSQLインジェクションを心配する必要はありません。

$con = <"Your database connection">;
$input = "What's up?";
$stmt = $con->prepare("insert into `tablename` (`field`)values(?)");
$stmt->bind_param("s",$input);
$stmt->execute();
0
Vaibhav Tomar