【问题标题】:query with single quote shown as empty单引号查询显示为空
【发布时间】:2012-05-09 02:45:13
【问题描述】:

我有一个表格,当您选择文章下拉列表时,文本框会填入您选择的内容。现在它工作得非常好,除非文章名称中有“单引号”。

我有一个通过在引号前面放置反斜杠来转义引号的功能,它确实......

现在产生的查询如下:_

SELECT * FROM blogs WHERE title='MySQL \'Inject' AND series='iOS Game Dev.' AND language='iOS' LIMIT 1

我有一个函数可以创建文章的对象并根据所选行设置所有内容的值。当我显示由运行查询的函数创建的数组时,它给出了这个..

Blog Object
(
 [id] => 
 [title] => 
 [publish_date] => 
 [author] => 
 [language] => 
 [series] => 
 [likes] => 
 [content] => 
 [position] => 
 [status] => 
 [last_updated] => 
) 

如果文章名称中没有单引号,它可以工作,但它不会填充文本框,因为数组是空的。

更多存储在数据库中的值是 MySQL \'Inject 。所以我真的不明白它为什么这样做,我什至尝试在 MySQL Workbench 中运行查询,但它什么也没返回。所以我很确定这在我的代码中不是问题。

【问题讨论】:

  • 不要使用=,而是给LIKE一个机会:WHERE title LIKE '%MySQL \'Inject%'
  • @juergend 这将使撇号完全消失,如果我想在标题中加上单引号怎么办?
  • @JahanzebKhan:不,它还在那里。看到这个Example
  • 嗯....你能告诉我一件事吗?我是否应该像那样插入数据库,这意味着不是在数据库中的引号之前插入 \,而是使用 str replace 将 ' 替换为 '' 而不是使用 mysql_real_escape_string?当我选择它时,只需正常选择它?

标签: php mysql forms mysql-workbench


【解决方案1】:

我建议您不必担心转义,只需使用准备好的语句,将变量作为参数传递到其中。

This blog article 有一个很好的教程。

【讨论】:

  • 如果您的意思是创建函数来开发查询,那么这就是我所做的,这就是查询的形成方式......
  • 不,我不是这个意思。你看教程了吗?它的本质是,不是将标题/系列/语言放入 SQL 语句中,而是将占位符放在那里;然后,您“准备”要执行的语句,然后在执行时为这些占位符提供值。
  • 哦,抱歉,我当时没有时间,但我刚刚阅读了博客,我真的很喜欢这些准备好的陈述,现在我将使用双引号,但我会更深入地研究准备好的声明很快!谢谢!
  • 如果我使用准备好的语句,我是否需要转义字符串或使用两个单引号?还是他们自己添加安全性?
  • @JahanzebKhan:不,您不需要执行任何转义;您甚至不需要在字符串周围添加引号 - 一切都为您处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多