【问题标题】:OOP query, showing 2 queriesOOP 查询,显示 2 个查询
【发布时间】:2015-03-13 09:41:39
【问题描述】:

我目前无法将数据插入我的数据库。我有这段代码可以开始插入查询:

if (Input::exists()) {
    $validate = new Validate();
    $link = new Link();

    $validation = $validate->check($_POST, array(
        'name'  =>  array(
            'related'   =>  'hyperlink'
        ),

        'hyperlink' =>  array(
            'related'   =>  'name'
        )
    ));

    if ($validation->passed()) {
        try {
            $link->create(array(
                'uid'       =>  $user->data()->id,
                'name'      =>  Input::get('name'),
                'hyperlink' =>  Input::get('hyperlink')
            ));
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    } else {
        echo '<div class="error">';
        echo '<ol>';

        foreach ($validation->errors() as $error) {
            echo '<li>' . $error . '</li>';
        }

        echo '</div>';
        echo '</ol>';
    }
}

运行这段代码时,会调用create方法:

public function create($fields = array()) {
    if (!$this->_db->insert('user_links', $fields)) {
        echo 'Something went wrong';
    }
}

现在脚本将运行插入方法:

public function insert($table, $fields = array()) {
    if (count($fields)) {
        $value_list = implode(", ", array_values($fields));
        $keys = array_keys($fields);
        $sql = "INSERT INTO `$table` (`" . implode('`, `', $keys) . "`) VALUES ({$value_list})";

        if (!$this->query($sql, $fields)->error()) {
            return true;
        }
    }

    return false;
}

一切都很好,但是当它进入 query() 方法时,它似乎保存了 2 个查询。我已经听说过__destruct,所以我想知道它是否与此有关。

查询方法如下:

public function query($sql, $params = array()) {
    $this->_error = false;
    echo $sql;

    if ($this->_query = $this->_pdo->prepare($sql)) {
        $x = 1;

        if (count($params)) {
            foreach ($params as $param) {
                $this->_query->bindValue($x, $param);
                $x++;
            }
        }

        if ($this->_query->execute()) {
            $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
            $this->_count = $this->_query->rowCount();
        } else {
            $this->_error = true;
        }
    }

    return $this;
}

当我在 query() 方法中回显 $sql 时,它回显如下:

SELECT * FROM users WHERE id = ?INSERT INTO user_links (uid,name,hyperlink) VALUES (1, test, test)

SELECT * FROM users WHERE id = ? 来自 get() 方法。但是在我为查询设置所有数据的代码中,我没有使用任何 get() 方法。除非获取输入字段的值。 (但这不是问题)

感谢您的帮助!

编辑 1:

选择方法:

public function get($table, $where) {

    return $this->action('SELECT *', $table, $where);

}

编辑 2:

public function find($user = null) {

    if ($user) {

        $field = (is_numeric($user)) ? 'id' : 'email';
        $data = $this->_db->get('users', array($field, '=', $user));

        if ($data->count()) {

        $this->_data = $data->first();

        return true;

        }

    }

}

编辑 3:

public function action($action, $table, $where = array()) {

    if (count($where) === 3) {

        $operators = array('=', '>', '<', '>=', '<=', '<>');

        $field      = $where[0];
        $operator   = $where[1];
        $value      = $where[2];

        if (in_array($operator, $operators)) {

            $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";

            if (!$this->query($sql, array($value))->error()) {

                return $this;

            }

        }
    }

    return false;

}

【问题讨论】:

  • 假设你在 laravel 上?指定你的框架
  • 纯 php,无框架。
  • 向你展示selectget 类的get 方法,我敢打赌你必须通过一些其他查询来获取当前用户
  • 完成,我编辑了我的帖子
  • 是我遗漏了什么还是您没有正确准备插入语句?看起来您将值直接放入插入字符串中

标签: php sql oop


【解决方案1】:

问题是您没有终止 SQL 语句。您需要将; 放在查询字符串的末尾,以便两个查询都可以运行。

就像insert()方法中的一样

$sql = "INSERT INTO 
         `$table` (`" . implode('`, `', $keys) . "`) 
         VALUES ({$value_list});"; //added semicolon 

在调用actionget() 方法中也这样做

由于两个查询合并,当前您的 sql 无效,; 将使两者都有效并且可以工作。

'uid'       =>  $user->data()->id,

以上代码是第二次查询的原因

SELECT * FROM users WHERE id = ?

注意:您应该考虑使用singleton 来处理数据库,并且一次运行一个查询。目前您的$sql 属性有两个查询连接SELECT * FROM users WHERE id = ?INSERT INTO user_links (uid,name,hyperlink) VALUES (1, test, test)。或者查询数组也可以。

更新:

在这样的操作方法中添加;并尝试

$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ? ;";

【讨论】:

  • 分享您的操作$this-&gt;action('SELECT *', $table, $where); 方法如果上述方法不能解决您的问题
  • 再次编辑帖子
  • 分享你actionget()使用的方法
  • 在第一个代码块(页面顶部)中,我提到了$user = new User();。这导致出现双重查询。我删除了它,但我的查询仍然无法正常工作:\
  • echo $sql; 现在提供什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多