1

SELECT単純な句でテーブルを実行すると、WHERE完全に一致しないレコードが返されると、奇妙な動作が発生します。

私のテーブルにはid int(11)主キーとして列があります。たとえば、ID 5350 のレコードを検索するには、次の 2 つのクエリはどちらも ID 5350 のレコードを返します。

SELECT * FROM mytable WHERE id="5350"
SELECT * FROM mytable WHERE id="5350abcd"

私が考えていたのは、5350 前後の "" を削除することでしたが、同じ結果が得られました。codeigniter で、私はこれを試しました:

$where = "id=$my_id";
$this->db->where($where);

なぜこれが起こっているのですか?正確でないIDがレコードを見つけられないように修正するにはどうすればよいですか?

4

5 に答える 5

1

2 番目のクエリでは、ID 値は整数ではありません。クエリを実行する前に、値が整数であることを確認する必要があります。そうしないと、値が整数にキャストされます。

于 2012-12-14T16:44:21.907 に答える
1

フィールドが Int であるため、数値に解決されます。単に ="abcd" と言うと、ゼロに解決されます。

ああ、int値の引用符は必要ありません

于 2012-12-14T16:45:06.387 に答える
1

私の推測では、int型であるため、文字を解析します。アルファであるすべてを無視します。数字が追加された同じ ID を持っているため、文字の前の数字に解決されます。

5350 <-- INT
5350abcd <--- 'abcd' gets parsed out because it's not of INT type. 
You end up with 5350 without the abcd at the end. 

フィールドのデータ型が varchar だった場合、すべてが解析されます。

于 2012-12-14T16:50:03.763 に答える
0

これを試して:

$where = array('id' => $my_id);
$this->db->where($where);
于 2012-12-14T16:47:44.533 に答える
0
$where = "id=".((string)(int)$my_id === $my_id ? $my_id : 0);
$this->db->where($where);

しかし、何もクエリを作成しないため、このソリューションは依然として醜いです。$my_idクエリを作成する前に、が正しいかどうかを確認する必要があります。

于 2012-12-14T16:47:44.987 に答える