PHP / MYSQL问题按主键选择

时间:2010-05-28 08:23:51

标签: php mysql primary-key

所以我有一个名为key的主键列。我试图通过以下代码选择key = 1的行:

$query ="SELECT * FROM Bowlers WHERE key = '1'"; 
$result = mysql_query($query) or die(mysql_error());

出于某种原因,我得到了这个结果:

  

您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在第1行的'key ='1''附近使用正确的语法

mysql语句适用于使用其他键,即WHERE name ='djs22'。

有什么想法吗?

5 个答案:

答案 0 :(得分:7)

键是一个保留字,试着在它周围加上滴答声:

$query ="SELECT * FROM `Bowlers` WHERE `key` = '1'"; 
$result = mysql_query($query) or die(mysql_error());

要查看所有保留字,请转到此处向下滚动: http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html

答案 1 :(得分:2)

'key'是一个保留的关键字,在它周围加上反引号:

"SELECT * FROM Bowlers WHERE `key` = '1'"

答案 2 :(得分:2)

不检查,“key”可能是MySQL中的保留字。 尝试用反引号包装它

$query ="SELECT * FROM Bowlers WHERE `key` = '1'";  

答案 3 :(得分:1)

您应该在引号

中写下列名称键
$query ="SELECT * FROM Bowlers WHERE `key` = '1'";

否则它是关键字

答案 4 :(得分:0)

我一直都遇到这种情况。 MySQL有一堆保留字。当你遇到一个时,mysql错误函数甚至不足以让你知道出了什么问题。

您唯一能做的就是更改列名称。前几天我意外地使用了“约会,往返”。 DuHH !!!当我恍然大悟的时候把头发拉了出去!那些是DB保留。

您可以在其周围包装所有类型的引号,它引用列名称时无关紧要。保留是保留的!

通常的做法是做一些事情。

1)制作表格时:使用下划线拆分资源名称的资源类型。示例:xref_userMessages

This would mean it is a cross reference table for User messages.

2)表名的其他示例:

msg_Messages | sys_Settings | cli_Logins
因此,与消息相关的任何其他表都将被称为msg _ ??? ,这不仅可以使它们在phpMyadmin中组合在一起,而且还可以更容易地记住这些名称。

3)制作列时:切勿使用保留。因此,使关键列始终为6个小部件。示例:

admkey | usrkey | msgkey | clikey grpkey

Obviously Admin Key | User Key | Message Key | Client Key | Group Key

所以这意味着“msg_Messages”键是“msgkey”,xref表是xref_Messages,其键是xref_msgkey。遵循这个逻辑,你不仅知道如何命名所有内容而不考虑它,但你从来没有遇到任何保留的话。

4)列名称示例:

dateInsert dateStart timeCreate admName admAddress admPhone admCell

就像上面一样,它有一个逻辑。将目的/所有者和名词/项目放在一起会产生名称,并再次避免使用保留字。

最后一个例子:

表:users_Admins users_Clients 关键:admkey usrkey

表:msg_Messages 列:msgkey admkey usrkey msgRead msgMessage msgTitle

就在这个简短的例子中,我避免了2个保留字。关键和阅读

简而言之,您的问题不在于读取主键。这是列名称的问题。 MySQL将您的代码视为具有不合适命令的语法。 SELECT read ...或SELECT键...如果你在它周围加上引号并不重要。 MySQL基本上看到......

SELECT (SELECT,WHERE,FROM) FROM select,from,where 
WHERE SELECT = WHERE & FROM = SELECT. hehehehehehehe

在此处添加不同类型的引用不会改变您刚刚发送给MySQL的混淆程度。

将我的错误和你的错误混合起来就像这样......


SELECT key,from,to,date FROM my_table WHERE key='1';

// Same as...
SELECT SELECT,SELECT,SELECT,SELECT FROM my_table WHERE SELECT='1';

第一个你无法通过观察它真正告诉它有什么不对。第二个显然是不对的,也不行。但是,根据MySQL,它们是相同的。

MySQL接收这种语法就是这样...... SELECT?你告诉我SELECT 5次,从来没有告诉我甚至选择什么。你得到了正确的FROM,然后你用一个左钩子告诉你选择别的东西,你不仅没有告诉我再次选择什么,而是你扔了一个NULL ='1';到底是怎么回事? 这就是为什么当你犯这些错误时,错误函数甚至不会报告发生了什么。有这么多的错误,它不会给你一个错误号码,所以它只是停止。

So this means your syntax is like this
SELECT * FROM Bowlers WHERE SELECT = '1';

有时我会感到沮丧并说:“我希望MySQL比这更聪明!!!”但后来我意识到我必须将关键词换成一个价值较低的数据库。这些保留字中的每一个代表一个单词,它在我的数据库方面做了很多工作。当我第一次开始学习编程时,我必须编写自己的文本输入字段子例程,所以我很欣赏MySQL为我做的所有简洁的事情。