对带有单引号的文本的查询问题


query problem with a text with a single quote

我需要做这个查询:

SELECT * FROM brands WHERE brand =`l'artigiano italiano`

应该很简单,但它不起作用。像我所有的查询一样,我尝试用以下代码执行它

$myDB = Database::getConnection($target='....',$key='....');
$sqlLogo = 'SELECT * FROM brands WHERE brand =`' . $brand->merk . '`';
$resultLogo = $myDB->query($sqlLogo);

当我打开页面时,我得到以下错误

PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'l'artigiano italiano' in 'where clause': SELECT * FROM brands WHERE brand =`l'artigiano italiano`; Array ( ) in merken_admin_settings() (line 23 of /home/mediaspe/domains/mediaspex.be/public_html/juniorsteps/sites/all/modules/merken/merken.admin.inc)

我试图使用

WHERE brand = "..."

WHERE brand = `...`

但两者都不起作用

对可能的原因有什么建议吗?

应该转义SQL查询中嵌入的任何内容。当您使用PDO时,您应该使用$myDB->quote():

$sqlLogo = "SELECT * FROM brands WHERE brand = '" . $myDB->quote($brand->merk) . "'";

您可以使用双引号(")和单引号(')来封闭您的值,但不能使用反引号(')。

最好使用预处理语句:

$stmt = $myDB->prepare("SELECT * FROM brands WHERE brand = :brand");
$resultLogo = $stmt->execute(array('brand' => $brand->merk));

您试过转义单引号吗?

"l''artigiano italiano"

MySQL字符串语法

虽然所有其他答案都对常规的mysql_*函数有效,但如果您使用PDO,则应该利用准备好的语句。

只是转义单引号可以做到这一点,但尝试PDO预处理语句,它们也可以帮助您提高安全性(正如这里已经讨论过的)
你可以这样做:

$brand = "l'artigiano italiano";
$stmt = $db->prepare('SELECT * FROM brands WHERE brand = :brand');
$stmt->execute( array(':brand' => $brand) );

看起来您正在使用Drupal。如果是这样(我假设从您获得数据库连接的方式和明显的标记),您应该像这样执行查询:

$result = db_query('SELECT * FROM {brands} WHERE brand = :brand', array(':brand' => $brand));

。注意:

  • 使用db_query(),它将在内部调用Database::getConnection()。你只需要自己调用Database::getConnection()如果你想连接到另一个默认连接

  • 对Drupal管理的表(也就是说,通过模块的hook_schema()安装的表)使用uf花括号({})。如果这是一个与Drupal安装无关的外部表,则不需要这些表。花括号确保在drupal安装配置了正确的表名前缀的情况下(例如运行测试时的情况!)

  • 动态值可以使用:占位符语法,并直接在db_query()的第二个参数中指定值(或$myMD->query(),这是相同的接口)。