简单选择语句的where子句中的MySQL未知列

Posted

技术标签:

【中文标题】简单选择语句的where子句中的MySQL未知列【英文标题】:MySQL Unknown column in where clause for simple select statement 【发布时间】:2012-07-13 21:12:59 【问题描述】:

我有一个非常基本的选择语句导致列未知错误。当我尝试在变量中使用字符而不是数字时,就会出现查询问题。想知道它是否与排序规则有关。

这是我目前所拥有的:

$titleno=$_REQUEST['title_no'];
$titleno=mysql_real_escape_string($titleno);
$titleno = utf8_decode($titleno); //tried without this before but didn't work
$query="SELECT * FROM `Titles` WHERE `title-no` = '".$titleno."'"; 
//tried various versions of this query - left it as single quotes as that seems to be the correct way. This only fails when a character is entered. Numbers work fine.  

echo "query - <br> $query <br>";    
$get_title_result=mysql_query($query) or die(mysql_error());
//here I get the unknown column name error - MySQL treats the titleno as the column name 

回声输出:

SELECT * FROM `Titles` WHERE `title-no` = '1234566d' 
Unknown column '1234566d' in 'where clause'

如果我没有在 title-no 中使用“d”,它可以正常工作....此外,我尝试了一个没有连字符的不同列名,但仍然得到相同的行为。 DB 将 title-no 的排序规则定义为 latin1_swedish_ci。 (将查询粘贴到mysqladmin时不会出现此问题)

这是表定义:

CREATE TABLE `Titles` (  
 `id` int(11) NOT NULL auto_increment,  
 `title-no` varchar(15) NOT NULL,  
  UNIQUE KEY `title-no` (`title-no`),  
  KEY `id` (`id`)  
  ) ENGINE=MyISAM  
  AUTO_INCREMENT=9090949 DEFAULT CHARSET=latin1 AUTO_INCREMENT=9090949 ;

已解决:问题不在于此查询。这是随后的查询。我很困惑,因为我只是在回应这个查询。我的错。谢谢大家的支持! :)

【问题讨论】:

你也可以粘贴你的表定义吗? 在字段名称周围保留反引号。但千万不要在值周围使用反引号,否则mysql会将它们解释为字段名并抛出错误。 您在代码中的哪个位置回显您的查询?您可以使用添加到代码中的 echo 语句来更新您的问题吗? @Jocelyn - 添加了 echo 语句。就在运行查询之前... 查询看起来不错。也许这是一个愚蠢的提示,但请确保 this 查询是引发错误的查询,并且它不是脚本后面的另一个查询,您忘记了正确的单引号 :) 只有这样我才会开始深入研究奇怪的字符编码问题... 【参考方案1】:

尝试:

$query = "SELECT * FROM Titles WHERE `Titles`.`title-no` = '" . $titleno . "'"; 

【讨论】:

已解决。我也忘记了撇号,因为表的- @Gabriel 我尝试了您的建议(在修复引号后),但没有成功。由于连字符,您需要在标题中加上引号或引号(我认为,否则它将仅将其视为错误的标题)谢谢。 @Jocelyn - 我尝试了各种引号、单引号、刻度等。该查询适用于数字,我认为这与在其中添加字符有关.. .不知道发生了什么。谢谢。【参考方案2】:

这是到基于语句的查询的快速转换(使用 MySQLi,根据需要调整您的代码或此示例)。假设是底层准备好的语句引擎知道您不能在准备好的语句中指定带有占位符的列名,因此它应该正确传递它(希望:-)

$titleno=$_REQUEST['title_no'];
$statement=mysqli_prepare($your_mysqli_link, "SELECT `id` FROM `Titles` WHERE `title-no` = ?"); 
mysqli_stmt_bind_param($statement, 's', $titleno);
mysqli_stmt_execute($statement);
mysqli_stmt_bind_result($statement, $found_id);
mysqli_stmt_fetch($statement);
echo "found id: $found_id";

【讨论】:

以上是关于简单选择语句的where子句中的MySQL未知列的主要内容,如果未能解决你的问题,请参考以下文章

#1054 - MySQL 中“where 子句”中的未知列“proximite”

即使插入了列,“WHERE”子句中的 SQL 未知列

Where 子句中的未知列

mysql语句where条件中的是啥意思

是否可以使用“WHERE”子句来选择 SQL 语句中的所有记录?

使用 Where 子句从视图中选择以引用另一个数据库 - 未知列错误