1

無効なタイプのパラメーターにバインドするときにエラーが発生しないのはなぜですか?例えば:

$mysqli = new mysqli(HOST, USERNAME, PASSWORD, SCHEMA);
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}

$stmt = $mysqli->prepare("update app_site_group set name_eng=?, name_fra=? where app_site_group_id=?");

$one = "one";
$two = "two";
$three = "a";
$stmt->bind_param('ssi',$one,$two,$three);

$stmt->execute();

3番目のパラメーターは、整数が予期されたときに文字列として渡されます。エラーはスローされません(0行が影響を受けることを除いて)。

4

1 に答える 1

3

整数として指定するのiは、MySQLiが値をクエリに渡すタイプです。ただし、API自体は、値が文字列を取得するか整数を取得するかを実際には気にしません。PHP / MySQLiは、文字列をRDBMSに渡すときに、必ず整数にキャストします。

したがって、数値に見える文字列は、同等の整数にキャストされます。のような数値以外の文字列の'a'場合、結果は整数0になります。これは、データの行と一致する場合と一致しない場合があります。

echo (int)'a';
// 0

したがって、あなたの場合、実行されたクエリは次のようになります。

update app_site_group set name_eng = 'one', name_fra = 'two'  where app_site_group_id = 0 

の行がある場合app_site_group_id = 0、それらは一致しているはずです。したがって、プリペアドステートメントを使用することに加えて、パラメーターの内容を常に検証して、パラメーターに正しい値が含まれていることを確認することが重要です。

于 2013-02-07T20:54:50.967 に答える