OOP查询,显示2个查询

时间:2015-03-13 09:41:39

标签: php sql oop

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

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

现在脚本将运行insert方法:

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;

}

1 个答案:

答案 0 :(得分:0)

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

insert()方法

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

并且在调用get()的{​​{1}}方法中执行相同的

目前你的sql无效是因为两个查询被合并,action将使两者都有效,并且它将起作用。

;

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

'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)并尝试

;