此处我以某个用户(admin)身份登录并尝试更新其他用户的群组。我不确定什么不起作用。我从数据库类中得到了sql echo,让我看看我正在经历的内容。 sql应该是正确的,我会把它放在下面。
我会确保指出要查看的位置,因此您不会进行大量搜索。即使你只是稍微知道可能出错的一些线索,请分享。
以下是我尝试更新用户的表单。我将仅发布相关的php和表单,以便您可以看到我想要完成的任务。
$selectedUser = new User(Input::get('username'));
try {
$user->update(array(
'group' => Input::get('group')
),'username',$selectedUser->data()->username);
Session::flash('home','The group has been updated');
Redirect::to('index.php');
} catch(Exception $e) {
die($e->getMessage());
}
<h3>1: Standard User</h3>
<h3>2: Administrator</h3>
<h3>3: Moderator</h3>
<h3>4: Admin/Mod</h3>
<form action="" method="post" autocomplete="off">
<label for="group">Change Group to</label>
<input type="number" name="group" id="group">
<label for="username">for this username</label>
<input type="text" name="username" id="username">
<input type="submit" value="Change Group">
<input type="hidden" name="token" value="<?php echo Token::generate(); ?>">
</form>
当我在组字段中输入2并将jacob输入到用户名字段时,这就是我收到的内容:
UPDATE用户SET组=? WHERE username = Jacob
更新时出现问题。
这堂课真的很长,所以我要发布相关的材料,如果有什么东西让你困惑,请问我,我会说明。如果你看第二个方法更新,你可以看到我在哪里回应sql。这是DB类:
public function query($sql, $params = array()) {
$this->_error = false;
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;
}
public function update($table, $chosenfield, $id, $fields){
$set = '';
$x = 1;
foreach($fields as $name => $value){
$set .="{$name} = ?";
if($x < count($fields)){
$set .= ', ';
}
$x++;
}
$sql = "UPDATE {$table} SET {$set} WHERE {$chosenfield} = {$id}";
echo $sql, '<br>';
if(!$this->query($sql, $fields)->error()){
return true;
}
return false;
}
这是我在此使用的用户类方法的难题的最后一部分。这也是我返回错误的地方&#39;更新问题&#39;:
public function update($fields = array(), $chosenfield = 'id', $id = null) {
if(!$id && $this->isLoggedIn()) {
$id = $this->data()->id;
}
if(!$this->_db->update('users', $chosenfield, $id, $fields)) {
throw new Exception('There was a problem updating.');
}
}
答案 0 :(得分:1)
你的问题一直摆在我面前,但有点难以整理,因为在看到完整的代码之前我不清楚与什么有关。
在DB::update()
第108行:
$sql = "UPDATE {$table} SET {$set} WHERE {$chosenfield} = {$id}";
// becomes: UPDATE users SET group = ? WHERE username = Humiid2
echo $sql, '<br>';
if(!$this->query($sql, $fields)->error()){
return true;
}
看起来您正在阅读有关预准备语句的内容,并且可能过早地跳过,因为您正在为预准备语句创建查询,但是将其作为原始SQL执行。 PDO::query()
用于执行原始SQL。通常,对于处理用户输入,您希望使用预准备语句,这就是您开始做的事情。
这是您的更新代码的样子。
请参考以下功能:
PDO::prepare
此函数创建并返回预准备语句。一种方法是用?
替换变量。
示例:
$stmt = $pdo->prepare("SELECT * FROM table WHERE id = ?");
PDOStatement::bindParam
此功能将参数绑定到问号。您也可以通过将数组传递到exec()
函数来完成此操作。在它最简单的形式中,它需要2个参数。 ?
的索引(即第一个为1,第二个为2,等等),以及替换它的值。
示例:
$stmt->bindParam(1, 32);
PDOStatement::execute
此函数执行查询,如果出错则返回false。如果使用bindParam函数,它不会采用任何参数。
实施例
$success = $stmt->execute();
因此,您的update()
方法的更新代码可能如下所示:
$sql = "UPDATE {$table} SET {$set} WHERE {$chosenfield} = ?";
// Create the prepared statement
$stmt = $this->_pdo->prepare($sql);
// Bind each parameter
for($i=0; $i<count($fields); $i++)
$stmt->bindParam($i+1, $fields[$i]);
// Copy the last one
$stmt->bindParam($i+1, $id);
// The execute call tells whether or not the query was successful
if($stmt->execute()){
return true;
}
return false;
方便提示:execute已经返回一个布尔值,因此只需返回执行调用就可以节省几行。
return $stmt->execute();