我目前在将数据插入数据库时遇到问题。我有以下代码开始插入查询:
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} ? ;";