Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么可以使更新查询不更新而返回成功_Php_Mysql - Fatal编程技术网

Php 什么可以使更新查询不更新而返回成功

Php 什么可以使更新查询不更新而返回成功,php,mysql,Php,Mysql,我使用这个类来执行查询-插入、删除、删除创建等,但这次我创建了一个方法来更新提交更新后的表,令我惊讶和头痛的是,返回成功但没有实际更新数据库中的记录。我很困惑,我已经调试了数小时,但都没有用 所以我决定和大家分享我的担忧,看看我是否能得到帮助,因为我实际上已经2周大了 这是我的课 class queryClass extends MYSQL{ //MYSQL is for connecting to database //table fields var

我使用这个类来执行查询-插入、删除、删除创建等,但这次我创建了一个方法来更新提交更新后的表,令我惊讶和头痛的是,返回成功但没有实际更新数据库中的记录。我很困惑,我已经调试了数小时,但都没有用 所以我决定和大家分享我的担忧,看看我是否能得到帮助,因为我实际上已经2周大了

这是我的课

   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
上处理表单,因此我的错误是,当我仍然在编辑url
editor.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