gpt4 book ai didi

sql - 错误 :SQLSTATE[42000]: Syntax error or access violation: 1064

转载 作者:行者123 更新时间:2023-12-04 15:56:09 25 4
gpt4 key购买 nike

过去 3 个小时我一直在寻找答案,但我不知道该怎么做。这是代码:

    function get_data($tablename)
{
try
{
$conn = $this->conn();
$stmt = $conn->prepare("SELECT * FROM :tablename ORDER BY id");
$stmt->bindParam(':tablename', $tablename, PDO::PARAM_STR);
$stmt->execute();
return $stmt;
}
catch (Exception $e)
{
echo "ERROR:" . $e->getMessage();
}
}

这里是错误:

ERROR:SQLSTATE[42000]: Syntax error or access violation: 1064 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 ''products' ORDER BY id' at line 1

我做错了什么?...

最佳答案

如前所述here (感谢@YourCommonSense),您不能将参数用作表名;如果这样做,将发生以下两种情况之一:

  1. 使用适当的准备语句,准备语句模块将抛出异常(这是正确的,因为您已要求它完成不可能的事情)。
  2. 使用模拟的准备语句,参数将被盲目地转义、单引号和替换,导致 SQL 语法错误。这就是这里发生的事情。

这就是问题所在。至于解决方案:

  • 重新评估您的数据库设计。您真的需要像那样将数据拆分到不同的表中吗?如果不是,则将相关数据合并到一个表中,并进行相应查询。
  • 如果您对设计感到满意(或无法更改),您将需要一个丑陋的不安全黑客,如下所示:

    function get_data($tablename, $acceptable_tablenames = array()) {
    /* $acceptable_tablenames is an array of strings, containing
    * table names that you'll accept. It's your job to make sure
    * these are safe; this is a much easier task than arbitrary
    * sanitization.
    */
    if (array_search($tablename, $acceptable_tablenames, true) === FALSE) {
    throw new Exception("Invalid table name"); /* Improve me! */
    } else {
    /* your try/catch block with PDO stuff in it goes here
    * make sure to actually return the data
    */
    }
    }

    将其称为 get_data($table, array("my_datatable_1", "my_datatable_2"))。感谢我回答开头链接的帖子以获取灵感。

关于sql - 错误 :SQLSTATE[42000]: Syntax error or access violation: 1064,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16997699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com