OOP 查询,显示 2 个查询


OOP query, showing 2 queries

我目前在将数据插入数据库时遇到问题。我有以下代码开始插入查询:

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;
}

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

就像insert()一样

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

并且在get()调用的方法中action做同样的事情

目前,由于合并了两个查询,您的 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} ? ;";