【问题标题】:SQL is breaking on a character I didn't put in my codeSQL 破坏了我没有放入代码中的字符
【发布时间】:2011-07-30 04:22:23
【问题描述】:

我在这个 PHP 代码上遇到语法错误:

<snip>
$last = (isset($_GET['last']) && $_GET['last'] != '') ? $_GET['last'] : 0;

$query = "SELECT message_id, user_name, message, date_format(post_time, '%h:%i') AS post_time" . 
    " FROM message WHERE chat_id = " . db_input($_GET['chat']) . " AND message_id > " . $last . ";";

$message_query = db_query($query);
</snip>

还有db_query

function db_query($query, $link = 'db_link') {
    global $$link;

    $result = mysql_query(mysql_real_escape_string($query), $$link) or db_error($query, mysql_errno(), mysql_error());

    return result;
}

确切的错误是这样的:

You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near '\' %h:%i\') 
AS post_time FROM message WHERE chat_id = 1 AND message_id > 0' at line 1<br><br>
SELECT message_id, user_name, message, date_format(post_time, '%h:%i') AS 
post_time FROM message WHERE chat_id = 1 AND message_id > 0;

如您所见,它会在我的代码中没有/看到的字符上引发错误。这是怎么回事?

【问题讨论】:

  • 您确定没有转义整个查询字符串吗?您能否也包括您的查询调用?
  • 好吧,发布您正在使用的确切代码,但似乎有些部分在不应该添加斜杠。
  • @John: 为什么在使用前不回显 $query?
  • @Hoàng:回显 $query 会输出正确的(不带“\”)查询。

标签: php sql syntax


【解决方案1】:

试试这个:

$query = "SELECT message_id, user_name, message, " . 
date_format(post_time, '%h:%i') . "AS post_time" . " FROM message 
WHERE chat_id = " . db_input($_GET['chat']) . "AND message_id > " . $last . ";";

尝试在字符串" . date_format(post_time, '%h:%i') . "之外调用date_format

【讨论】:

    【解决方案2】:

    您只需要在变量上使用mysql_real_escape_string,而不是在整个 sql 查询上。

    现在正在翻译:

    date_format(post_time, '%h:%i')
    

    到:

    date_format(post_time, \'%h:%i\')
    

    顺便说一句,我假设您的 db_input 函数准备了用于数据库的变量,因此您肯定也需要将它用于您的 $last 变量。

    【讨论】:

    • 果然,就是这样。谢谢。顺便说一句,我不能再接受 4 分钟。
    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多