5

シリアル化された文字列をSQLに保存しようとしていますが、引用符が原因でシリアル化を解除する際に問題が発生します。

たとえば、文字列は「te'st」です。シリアル化した後、次のようになります。

s:5:"te'st";

しかし、それをSQLに保存するには、スラッシュを追加する必要があります。

serialize(addslashes($string))

この後、MySQLデータベースに

s:6:"te'st";

そしてこれが問題です。s:6は、6つのシンボル文字列があることを意味しますが、「te'st」は5つしかないため、シリアル化を解除しようとするとエラーが発生します。

それを解決する方法は?htmlspecialcharsmysql_real_escape_stringを試しました

アップデート:

mysql_real_escape_stringの使用方法

 mysql_query("INSERT INTO `table`(`string`) VALUES ('" . serialize(array('iId' =>$aSqlResult['typeID'], 'sName' => mysql_real_escape_string($sScanResultLine))) . "')");
4

3 に答える 3

7

シリアル化の前ではなく、シリアル化のにデータをエスケープ関数に渡す必要があります。これが現在行っていることです。

$serialized = mysql_real_escape_string(serialize($data));

PDOまたはMySQLiでパラメーター化されたクエリを使用すると、エスケープを完全に忘れることができます。

于 2012-11-24T20:52:53.083 に答える
6

あなたは私が多くの人が犯しているのを見た間違いを犯しています。エスケープがどのように機能し、使用されるべきかについての根本的な誤解のビット。

エスケープ関数を単純に連鎖させて、どのような状況にも最適なものにすることはできません。あなたの間違いは簡単です。

あなたは2つのことをしています:

  1. オブジェクト(この場合は文字列)のシリアル化
  2. それをデータベースに保存します。

したがって、データベースに保存する前に、値が適切にエスケープされていることを確認する必要があります。MYSQLIでこれを実行してください!mysql_関数は機能していません。

同等のものはmysqli::real_escape_stringです。

しかし、最も重要なのは..(これをドラッグして申し訳ありません)。

serialize出力を変更すると、たくさんのものを返すことができます。引用符、0x00's、これはmysqlクエリでは許可されていません。

だからreal_escape_string明らかに最後のステップでなければなりません!最初にシリアル化し、その関数の出力をエスケープします。あなたは正反対のことをしました。

于 2012-11-24T20:55:00.407 に答える
3

あなたの場合、それmysql_real_escape_string()が進むべき道です。なんらかの方法で間違っていない限り、機能する必要があります(注:その関数を呼び出す前にDBに接続する必要があります)。実際、現在非推奨になっている拡張機能ではなく、 mysqli_またはを使用する必要があります。使用とは、単にタスクに間違ったツールを使用することです。PDOmysql_htmlspecialchars()

コードは次のようになります。

mysql_real_escape_string( serialize( $string ) );
于 2012-11-24T20:51:02.053 に答える