【问题标题】:Displaying fields from MySQL table but no field with quotes being printed显示 MySQL 表中的字段,但没有打印引号的字段
【发布时间】:2012-04-13 01:22:46
【问题描述】:

我正在从 MySQL 表中获取数据以将其显示在页面上。该脚本正在显示信息,但在我的表中,我们插入了普通引号作为另一种类型的引号字符,例如。 ( ’ )( “ ” ) 在 Microsoft Word 2010 中键入内容时会自动以这种方式格式化,用于键入表格中的大多数条目。所以我猜这些是特殊字符。但是,每当我测试显示带有实际单引号 ( ' )( " " ) 的字段时,我都会收到 mysql_fetch_row 期望参数 1 是资源,布尔给定 错误。这是我使用的代码:

$result = mysql_query("SELECT `question` FROM {$db_table_alt}");

while($field = mysql_fetch_row($result)) {
foreach($field as $fields) {

//build a unique section ID based on the ID that the Question belongs to
$uid = mysql_query("SELECT `id` FROM `questions` WHERE `question` LIKE '%$fields%'");
while($uidfield = mysql_fetch_row($uid)) {

但是每当我使用这条线时 $fields = mysql_real_escape_string(stripslashes($fields)); 将显示带有真实引号的字段,但引号前带有正斜杠。 有人可以帮我解决这个问题吗?

【问题讨论】:

  • 表中的实际数据是什么?当您对该列运行选择时,phpmyadmin 或您正在使用的任何客户端会显示什么?
  • 当我使用 phpmyadmin 时,它会正确显示与查询对应的列,但它是 php 的全部(如果是引号,尽管 mysql_real_escape_string 和带斜杠不会显示)情况。
  • 这两张表有什么联系? $db_table_alt 变量中有什么?看起来您不需要 2 个查询,而只需要一个。
  • 解决方案非常简单。我想知道为什么这两个家伙错过了它。

标签: php mysql mysql-real-escape-string stripslashes


【解决方案1】:

如果mysql_fetch_row() 抱怨一个布尔值,这意味着mysql_query 要么没有返回任何行,要么SQL 有错误(mysql_error() 会告诉你哪个)。

如果您在返回的数据中的引号之前出现反斜杠,那么它们将被放入数据库中。听起来magic_quotes 已启用。你真的很想关掉它,因为它是一个过时的问题解决方案。

另外,我认为您将不得不学习字符编码。恐怕默认的 MySQL 安装不会是 UTF8,它可能是 ISO-8859-15。 Word 过去喜欢在 Windows-1252 中编写文本,这不一样。然后,无论使用何种浏览器、网站和其他与数据库通信的东西,它都会变得更加复杂。我相信 PhpMyAdmin 会尝试在 UTF8 中运行,因此如果数据不是 UTF8, 会被转换为您的表格。这也会影响您寻找“智能引号”的查询。

【讨论】:

  • Magic_quotes 未启用,我运行了一行代码 echo "Magic quotes is " . (get_magic_quotes_gpc() ? "ON" : "OFF"); 并返回 OFF
【解决方案2】:

你似乎有两个明显的问题。

$result 的计算结果为布尔值,这意味着生成的查询中存在错误 (SELECT question FROM {$db_table_alt})。尝试回显该查询并手动运行它。可能是{$db_table_alt}命名的表/视图不存在。

第二个是字符串转义问题。我希望引号在数据库中被转义 - 在查询中使用 mysql_real_escape_string 不会改变返回的结果是否被转义。

另外,如果您在数据库中的数据被斜杠转义,您应该阅读魔术引号以及如何处理它们:PHP docs on magic quotes。从数据库中提取数据时,您不必进行任何字符串转义。

【讨论】:

  • 我确实回显了查询并手动运行它,它会打印所有字段,甚至是我正在测试的包含“真实引号”的字段。但是在页面底部,带有“真实引号”的字段应该以段落中的格式显示,就像所有其他字段一样,它只会发出 mysql_fetch_row 错误。有什么想法吗?
  • 您传递给mysql_fetch_row 的资源不是资源。它可能在某处被覆盖,但没有代码很难说。标准做法是去除所有不相关的代码,以便只显示那些没有按照您的预期执行的部分。大多数情况下,这可以解决问题。
  • 这里是我用来显示字段的所有代码的副本,所以你可以帮助我更多。 pastebin.com/6cVNCfYx
  • 我猜是第 66 行和第 78 行导致了错误。尝试回显生成的查询并针对 MySQL 运行它(使用 phpmyadmin 或您正在使用的任何东西),看看会发生什么。我希望 $fields 包含引号,并导致无效 SQL 导致 mysql_query 返回 false 而不是资源。
  • 天啊,"you don't need to worry about SQL injection here"
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多