【问题标题】:Syntax Error in programmatically generated query以编程方式生成的查询中的语法错误
【发布时间】:2018-09-13 16:15:20
【问题描述】:

我面临 mysqli_fetch_array() 错误及其告诉以下内容

错误:您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 靠近第 1 行的“1”

我正在准备一个分页过程,我的代码是这样的。

$_SESSION['sub']=$sub; // this holds the name of database which is working fine
$ques_per_page=1; // LIMIT 
$page_result = ($page-1)*$ques_per_page; //determines the SQL LIMIT starting number for the result on displaying page
$sql="SELECT question, ans1, ans2, ans3, ans4 FROM " .$sub. "LIMIT". $page_result .','. $ques_per_page ; // it is where error is 

不知道怎么回事

【问题讨论】:

  • 打印出最终的$sql 字符串,看看这个。另外请在此处使问题标题更具描述性(技术细节,而不是个人问题),并将完整的代码摘录放入代码块中。
  • LIMIT 周围没有任何空格。您的查询将类似于 ...FROM tableNameLIMIT1,...
  • 您错过了 LIMIT 前后的空格。将“限制”更改为“限制”
  • 每当您遇到查询问题时,请尝试打印查询并查看它或尝试在 db 中运行它
  • @Saurabh:使用直接从会话中提取的数据并将其注入 SQL 命令可能很危险。

标签: php mysql pagination


【解决方案1】:

在我看来,LIMIT 关键字前后缺少一个空格。

但是,如果您可以在所有 PHP 变量替换之后粘贴完整的扩展字符串,将会有所帮助。

旁注:使用. 连接运算符而不是简单地使用变量插值来链接字符串通常被认为是不好的做法,如下所示:

$sql = "SELECT question, ans1, ans2 from ${sub} LIMIT ${page_result}, ${ques_per_page}";

来自您的示例。

【讨论】:

  • 通常认为使用 .连接运算符 - 你想为此引用一些来源吗?!
  • @NigelRen:查看 Twitter 上的@bjacquemont,尤其是他关于 Opcodes 和 Zend 优化器的会议。
  • 当替换$sub 时,反引号可以防止保留字或非标准表名。
  • @NigelRen:啊,是的,对 MySql 来说是正确的。顺便说一句,通常应该避免使用会话中的数据,作为注入 SQL 命令的表名或其他部分。
  • @gabriel 为什么需要在字符串中使用大括号?为什么你应该避免使用会话中的数据?您确实应该提到准备好的语句是将变量传递给查询的正确方法
【解决方案2】:

成功了 我这样写了查询 $sql="SELECT * FROM $sub LIMIT $page_result, $ques_per_page" ;而不是$sql="SELECT question, ans1, ans2, ans3, ans4 FROM " .$sub. "LIMIT". $page_result .','. $ques_per_page ; 谢谢大家的回复.....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 2013-06-19
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2014-10-26
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多