1

バックグラウンド

  • フレームワーク: Codeignighter/PyroCMS

製品のリストを格納する DB があります。重複した製品にduplicate function' ' 値を追加できるように、共通の製品名を最初に検索するアプリケーションを持っています。suffix

Products モデル クラスのコード

$product = $this->get($id);

$count = $this->db->like('name', $product->name)->get('products')->num_rows();

$new_product->name = $product->name . ' - ' . $count;

2 行目では、$product->name引用符が含まれている場合にのみアプリケーションが失敗します。Codeignighter がすべての文字列をエスケープしたことを理解していたので、なぜこのエラーが発生するのかわかりません。

そこで、MySQL エスケープ文字列関数を使用しようとしましたが、それも役に立ちませんでした。

エラーメッセージ

A Database Error Occurred

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Book%'' at line 3

SELECT * FROM `products` WHERE `name` LIKE '%Harry\\'s Book%'

var_dump

以下は、問題の行の前後でvar_dumponを実行した出力です。product->name

string 'Harry's Book' (length=12)

A Database Error Occurred

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Book%'' at line 3

SELECT * FROM `products` WHERE `name` LIKE '%Harry\\'s Book%'
4

3 に答える 3

1

他の答えは私にとってはうまくいきませんでしたが、これはうまくいきます:

$count = $this->db->query("SELECT * FROM `default_firesale_products` WHERE `title` LIKE '".addslashes($product['title'])."'")->num_rows();

CI Active Record がクエリをマングルするときはいつでも、代わりに生のクエリを入れるだけで完全に制御できます。

于 2014-05-30T03:31:56.900 に答える