【问题标题】:How can I reuse my query method to insert and fetch data from the database in PHP?如何重用我的查询方法在 PHP 中从数据库中插入和获取数据?
【发布时间】:2017-01-29 17:21:05
【问题描述】:

我为我的班级创建了一个查询方法,它可以从数据库中获取数据,但是当我开始插入某些内容时它不起作用

我的查询方法是这样的。

function query($sql, $params = array()) {
        $query = $this->_conn->prepare($sql);
        if(count($params)) {
            $position = 1;
            foreach($params as $param) {
                $query->bindValue($position, $param);
                $position++;
            }
        }

        if($query->execute()) { //error is here based on the error message: SQLSTATE[42000]
            $result = $query->fetchAll(PDO::FETCH_ASSOC);
        } else {
            return false;
        }


        return $result;
    }

当我调用上面的查询时,它出错了。

function insert($table, $data) {
        if(count($data)) {
            $keys = array_keys($data);
            $values = "";

            $counter =1;
            foreach($data as $field) {
                $values .= "?";
                if($counter < count($field)) {
                    $values .= ", ";
                }
                $counter++;
            }
            $sql = "INSERT INTO {$table} (`". implode('`, `',$keys) ."`) VALUES {$values}";
            if($this->query($sql, $data)) { //calling the method above
                return true;
            } 
        }

        return false;
    }

我认为错误出在查询方法中,它只能用于获取 数据。我怎样才能让它变得灵活(比如同时处理获取和 插入等数据)?

【问题讨论】:

  • UPDATE/INSERT 语句不返回结果集,只是一个状态,即 TRUE(有效)FALSE(无效)
  • PS:以后请给我们看COMPLETE错误信息
  • @RiggsFolly 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '???' 附近使用的正确语法在 C:\wamp64\www\security\db.php 的第 1 行第 30 行**错误出现在 $query->execute() 部分中的 query() 方法中
  • 看起来您缺少参数占位符之间的逗号
  • 如果你没有设置$pdo-&gt;setAttribute(PDO::ATTR_EMULATE_PREPARES, false);,那么在你执行查询之前不会发现错误,因为在你运行-&gt;execute()之前,查询实际上不会被发送到数据库进行编译

标签: pdo mysql-error-1064


【解决方案1】:

首先关于你的功能。它是过度的,同时也是有限的。你真正需要的是

function query($sql, $params = array()) {
    $query = $this->_conn->prepare($sql);
    $query->execute($params);
    return $query;
}

所以你可以通过简单地调用它来获得你现有的功能

$db->query($sql)->fetchAll();

但是可以使用任何其他类型的查询来调用它,包括删除和插入,更不用说使用命名占位符以及位置占位符以及使用其他链接方法,如 fetch() 或 rowCount()

现在是您的错误消息。 显然它与您的功能无关,但与您运行的查询有关。在询问如何重用查询方法来插入查询时,您必须提供真正的插入查询,而不是一些乱码导致错误结果的 PHP 代码。确保您的行为与您的言语相关是非常重要的。想测试插入查询吗?使用查询,而不是 PHP 代码!

最后,插入助手。除了明显的语法问题外,它本质上是prone to SQL injection,因此您必须至少转义您的标识符,或者最好将它们列入白名单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2018-08-27
    • 2021-09-14
    相关资源
    最近更新 更多