这个MySQL查询有什么问题?

11

现在是凌晨12:30,我已经连续编码了9个小时。我真的需要完成这个项目,但MySQL正在影响我的截止日期。你能帮我检查一下这段代码片段,看看是否能找出问题吗?

PHP/MySQL 查询

$q = $this->db->query("SELECT * FROM bans WHERE ip='".$ip."'");

不断返回以下错误...
MYSQL错误[2010年10月6日晚上11:31 CDT] 您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式。附近的语法是:'* FROM bans WHERE ip='206.53.90.231'',在第1行(1064)
我没有看到查询有什么问题。我甚至尝试了不同的方法来包含变量$ip,但都没有成功。
编辑: 只是补充一下,在我的数据库中,ip列是varchar(255)类型。
编辑2: 这是整个受影响的代码。请记住,这全部都在一个类中。如果我漏掉了什么,请让我知道。
另一个函数中的行
if($this->isBanned($_SERVER['REMOTE_ADDR'])===true) { return json_encode(array('error'=>'You are banned from this ShoutBox.')); }

受影响的功能

function isBanned($ip) {
    $q = $this->db->query("SELECT * FROM bans WHERE ip='".$ip."'"); $num = $this->db->affected_rows;
    if($num>0) { $row = $this->db->fetch_array($q); if(($row['expires'] < time()) && ($row['expires'] !== 0)) { $this->unbanUser($ip,'internal'); return false; } return true; } return false;
}

unbanUser函数

function unbanUser($ip,$t='box') {
    $q = $this->db->query("SELECT * FROM bans WHERE ip='".$ip."'"); $num = $this->db->affected_rows; if($num>0) { $q = $this->db->query("DELETE * FROM bans WHERE ip='".$ip."'"); 
    return (($t=='box') ? json_encode(array('status'=>'removed')) : true); } else { return (($t=='box') ? json_encode(array('error'=>'Unable to locate the user.')) : true); }
}

尝试在查询前打印 $ip - codaddict
奇怪的是,即使你在数据库类中使用mysql_real_escape_string()转义了它,也不应该影响错误信息中所提到的IP字符串... - BoltClock
@belwood - 是的,没错。 @Nirmal - 这不是复制粘贴 :/ @cHao - 是的,所有东西都是我自己打的。数据库是UTF-8,但这不应该影响查询。 @BoltClock's a Unicorn - 我甚至尝试了转义,但没有用。 - Kyle Ross
在主帖中添加一个编辑。 - Kyle Ross
@Nirmal - 不是的 :/ 我尽量避免使用define来避免冲突。主要帖子已更新。 - Kyle Ross
显示剩余6条评论
3个回答

7

发生错误的原因是你的DELETE语句,去掉DELETE后面的星号*就可以了。


2
这里肯定是“DELETE”引起了问题。 - Andrew Moore
天啊,今天我写了太多的查询语句,当涉及到 <pre>DELETE</pre> 时,完全没有思路。是的,这解决了我的问题。非常感谢您在这方面的帮助。 - Kyle Ross
2
这就是故事中的疙瘩! - Nirmal

0

试试这个:

$q = $this->db->query('SELECT * FROM bans WHERE ip="' . $ip . '"');

2
那对MySQL会有什么影响? - BoltClock
是的,正是我所想的。 - Kyle Ross
实际上,SQL标准规定字符串字面量必须使用单引号括起来,但是MySQL允许使用双引号(在SQL标准中,双引号类似于MySQL的反引号)。如果你曾经使用过不同的数据库管理系统,这可能会节省你几个小时的烦恼。 - imgx64

0

请检查您是否使用了 ' 字符或 ´ 字符(后者是重音符号)


我使用单引号而不是重音符号,但这从来没有关系过。 - Kyle Ross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接