Php 什么可以使更新查询不更新而返回成功
我使用这个类来执行查询-插入、删除、删除创建等,但这次我创建了一个方法来更新提交更新后的表,令我惊讶和头痛的是,返回成功但没有实际更新数据库中的记录。我很困惑,我已经调试了数小时,但都没有用 所以我决定和大家分享我的担忧,看看我是否能得到帮助,因为我实际上已经2周大了 这是我的课Php 什么可以使更新查询不更新而返回成功,php,mysql,Php,Mysql,我使用这个类来执行查询-插入、删除、删除创建等,但这次我创建了一个方法来更新提交更新后的表,令我惊讶和头痛的是,返回成功但没有实际更新数据库中的记录。我很困惑,我已经调试了数小时,但都没有用 所以我决定和大家分享我的担忧,看看我是否能得到帮助,因为我实际上已经2周大了 这是我的课 class queryClass extends MYSQL{ //MYSQL is for connecting to database //table fields var
class queryClass extends MYSQL{ //MYSQL is for connecting to database
//table fields
var $user_table = ''; //table names that will be used in all names, each query method will input its own table name
//connect to database
function dbconnect(){
MYSQL::dbconnect();
}
//prevent injection
function qry($query) {
$this->dbconnect();
$args = func_get_args();
$query = array_shift($args);
$query = str_replace("?", "%s", $query);
$args = array_map('mysql_real_escape_string', $args);
array_unshift($args,$query);
$query = call_user_func_array('sprintf',$args);
$result = mysql_query($query) or die(mysql_error());
if($result){
return $result;
}else{
$error = "Error";
return $result;
}
//update quote function
function updatequote($table, $message1, $message2, $column_name1, $column_name2, $column_name3, $quote_id){
$this->dbconnect();
$this->quote_id = $quote_id;
echo $message1, $message2;
//make sure table name is set
$this->user_table = $table;
$this->column_name1 = $column_name1;
$this->column_name2 = $column_name2;
$this->column_name3 = $column_name3;
//execute login via qry function that prevents MySQL injections
$result = $this->qry("UPDATE ".$this->user_table." SET ".$this->column_name2."='?', ".$this->column_name3."='?'
WHERE ".$this->column_name1."='?';", $message1, $message2, $this->quote_id );
// $result = mysql_query("INSERT INTO ".$this->user_table."(username, password) VALUES('$username', '$password')");
if($result){
$_SESSION['success'] = "The Update Was Successfully Saved";
header('location: edit_quotes.html');
exit();
return true;
}else{
$_SESSION['success'] = "The Update Was Not Saved".mysql_error();
header('location: edit_quotes.html');
exit(); //do something on FAILED login
return false;
}
}
//quote form
function quoteEditorform($formname, $formclass, $formaction, $helptext, $first, $second){
//conect to DB
$this->dbconnect();
echo"
<form name=\"$formname\" method=\"post\" id=\"$formname\" class=\"$formclass\" enctype=\"application/x-www-form-urlencoded\" action=\"$formaction\">
<h2>$helptext</h2>
<div><label for=qoute>NGWA QUOTE
<input type=button value='Quote' onclick=\"wrapInTags(this.form.message1,'quote')\">insert [quote].[/quote]tags
</label>
<textarea name=\"message1\" cols=\"40\" rows=\"4\" onclick=\"copySelection(this)\">$first</textarea><br>
</div>
<div><label for=\"qoute\">ENGLISH MEANING
<input type=button value='Meaning' onclick=\"wrapInTags(this.form.message2,'meaning')\">
insert [meaning].[/meaning]tags
</label>
".$record['meaning']."
<textarea name=\"message2\" cols=\"40\" rows=\"4\" onclick=\"copySelection(this)\">$second</textarea></div>
<input name=\"action\" id=\"action\" value=\"sendeditedquote\" type=\"hidden\">
<div>
<input name=\"submit\" id=\"submitV value=\"Save\" type=\"submit\"></div>
</form>
<div align=\"center\"><a href=\"edit_quotes.html?do=read_bb_codes\">Read Before Posting</a></div>
"; }
function createquotetable($tablename){
//connect to DB
$this->dbconnect();
$qry = "CREATE TABLE IF NOT EXISTS ".$tablename."(
quote_id INT(8) NOT NULL AUTO_INCREMENT,
ngwaquote TEXT NOT NULL,
meaning TEXT NOT NULL,
saved_date date,
PRIMARY KEY (quote_id)
) TYPE=INNODB
";
$result = $this->qry($qry);
return;
}
正确,当我执行查询时,成功/错误行返回更新成功,但在显示所有可用报价的另一个页面上,特定报价仍然没有更新
有过这种经历的人请告诉我我在做什么
正在询问行以获取原始查询
给你-
首先是清理我的帖子的方法,我使用它进行查询,使用$this->qry(这里有一些查询)
如果update语句的
where
子句与任何行不匹配,则update
语句将返回success。但是,它不会改变任何事情。
请注意,MySQL知道值何时没有真正更改,因此语句
UPDATE table1 SET col1 = 0 WHERE col1 = 0
对于受影响的行数,将始终返回0
如果您想知道是否有任何更改,请致电:
$rows_updated = mysql_affected_rows($this->connection);
or
$rows_updated = mysqli_affected_rows($this->connection); //if you're using mysqli
update语句仅在发生错误时指示失败
关于SQL注入的警告我注意到您使用了动态表名和列名。
如果这些值可以由用户以任何方式更改,或者可以通过受用户影响的另一个php会话影响的超全局值,那么就存在SQL注入漏洞
下面是如何保护您自己不受此影响的方法:如果要更新的字段与数据库中的字段不同,则不会更新。虽然它返回success,但简单的意思是它可以看到表并连接到数据库,我想我已经找到了问题的答案 在我有
$this->quote\u id
的地方,我后来发现页面编辑器url是editor.html?quote\u id=1
然后,当我提交时,它现在将在一个平面url==editor.html
上处理表单,因此我的错误是,当我仍然在编辑urleditor.html?QUOTE_ID=1
时,我没有请求报价ID,而是在editor.html
中不可能的时候请求它,因此它意味着返回空的报价ID我用它来更新,从而导致更新成功,但没有真正更新任何东西
所以
我所做的只是添加一个隐藏的输入标记,以获得正在编辑的quote_id,然后将其与表单的其余部分一起发布
这么简单,但花了我几个小时重读和重新编码,太棒了,
小事情容易使人沮丧
谢谢大家使用mysql\u impacted\u rows()查找受影响的行
mysql\u infected\u rows()
正在返回0
这意味着没有行受更新影响-正是我所说的祝贺解决方案!当你有能力时,请确保将你的答案标记为“已接受”,以便其他人可以从你的成功中学习。干杯~
UPDATE table1 SET col1 = 0 WHERE col1 = 0
$rows_updated = mysql_affected_rows($this->connection);
or
$rows_updated = mysqli_affected_rows($this->connection); //if you're using mysqli