私は奇妙な問題を抱えています...コード化されたSQLインジェクションを防ぐためにパラメータ化されたクエリを使用していますが、その動作の一部に問題があり、その周りの私の仕事は、パラメタリゼーションの目的を打ち負かしています。NULL値でパラメータ化されたクエリを使用する
は、私はこのクエリを作ってるんだと仮定します。
$db = new csmysqli('database',$host,$user,$pass);
$value = x;
$stmt = "INSERT INTO table SET value='%s'";
$result = $db->prepare($stmt, $value);
echo $result;
さてここで問題ません... xは結果の文字列、または私たちはこれを取得int型の場合:
INSERT INTO table SET value='123';
問題ありません...しかし、xがnullの場合:
INSERT INTO table SET value='NULL';
< ---そこに単一引用符が問題を引き起こす.... [OK]をので、私はそれを回避するために、これを試してみてください。
$value = "'x'"; // Notice the quotes now go around x
$stmt = "INSERT INTO table SET value=%s";
$result = $db->prepare($stmt, $value);
echo $result;
そしてxは整数や文字列であれば、私たちはこれを取得:
INSERT INTO table SET value=\'x\';
そしてnullが機能するようになりました:
INSERT INTO table SET value=NULL;
そこで質問です:
どのようにすることができます正常なデータとNULLデータの両方を取得して、正しくパラメータ化する
EDIT:
私は特別なmysqli_helperスクリプトを使用しています言及している必要があります。
class csmysqli extends mysqli
{
public function __construct($dbname = '', $host,$user,$pass)
{
parent::__construct($host, $user, $pass, $dbname);
}
public function query($query)
{
$numParams = func_num_args();
$params = func_get_args();
//merge in parameters only if needed
if ($numParams > 1) {
for ($i = 1; $i < $numParams; $i++) {
$params[$i] = parent::real_escape_string($params[$i]);
}
$query = call_user_func_array('sprintf', $params);
}
return parent::query($query, MYSQLI_STORE_RESULT);
}
public function prepare($query)
{
$numParams = func_num_args();
$params = func_get_args();
//merge in parameters only if needed
if ($numParams > 1) {
for ($i = 1; $i < $numParams; $i++) {
$params[$i] = parent::real_escape_string($params[$i]);
}
$query = call_user_func_array('sprintf', $params);
}
return $query;
}
}
そのコードはうまくいかないはずです。 '$ db-> prepare($ stmt、$ value);' [mysqli :: prepare](http://php.net/manual/en/mysqli.prepare.php ) – FirstOne
メモ:準備された文章を使うときは、テーブルに文字列として挿入しない限り引用符を使用しないでください。 – FirstOne
これは通常、mysqliを使って文を準備する方法ではありません。私はhttp://php.net/manual/en/mysqli.prepare.phpを閲覧することをお勧めします。あなたは値のプレースホルダとして '?'を使用しなければなりません。そして 'bind_param'関数を使って型と値を指定します。それはあなたのための一重引用符を処理する必要があります。そしてヌル値も私は信じています。 – kunruh