我目前在将数据插入数据库时遇到问题。我有这段代码开始插入查询:
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;
}
答案 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)
并尝试
;