2011-10-27 36 views
0

このクラスは、挿入、削除、削除などのクエリを実行するために使用していますが、今回は更新が送信されたときにテーブルを更新するメソッドを作成しました私の驚きと頭痛の時間は、それは戻り値の成功ですが、データベースのレコードを実際に更新していないので、混乱しているので、私は役に立たない時間をデバッグしています 私は私の心配を共有することを決めました。実際ので、ここでOOP PHPで古い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; 
     } 

ここに私の引用editor.htmlですしています私は成功/エラーラインは、更新が成功したが、それを返すクエリを実行するとき、私のクラスファイル

// instantiate all other needed classes 
$cleaner = new cleanPost(); 
$connect = new MySQL(); 
$connect->dbconnect();// connect to a database 
$bbcode = new BBCode(); 
$log = new logmein(); 

    if($_REQUEST['action'] == "sendeditedquote"){ 
    //post all the values to the database using our main class 

/*topic field checking */ 
     if($_REQUEST['message1'] == "" || $_REQUEST['topic'] > 600) { 
     $errmsg_arr[] = 'Sorry You Can\'t Send An Empty Qoute OR quote greater than 500 characters at a time'; 
     $errflag = true; 
                    }           

     if($_REQUEST['message2'] == "") { 
     $errmsg_arr[] = 'Sorry You Can\'t Update With An Empty Qoute'; 
     $errflag = true; 
             } 

      //If there are input validations, redirect back 
    if($errflag) { 
     $_SESSION['ERRMSG_ARR'] = $errmsg_arr; 
     session_write_close(); 
     header("location: edit_quotes.html"); 
     exit(); 
       } 
$log->updatequote("quotes", $_REQUEST['message1'], $_REQUEST['message2'], "quote_id", "ngwaquote", "meaning", $cleaner->clean($_GET['quote_id'])); 

} 

ai'ghtを含めた後、私は特定の引用はまだ

に更新されていない使用可能なすべての引用符を表示し、他のページで

このような経験をお持ちの方は、何が起こっているのか教えてください。

BEINGはHERE RAW QUERY のためのラインを求めたIT- 最初は私のポストをouy浄化方法であると私はあなたのwhere句場合$this->qry(somequeries here)

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 using $this->qry() 
     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; 
     } 
      } 
+0

影響を受ける行を検索するには、mysql_affected_rows()を使用します。 http://php.net/manual/en/function.mysql-affected-rows.php – Dev

+1

生のSQLクエリは何ですか? – user973254

+0

'mysql_affected_rows()'は '0'を返しています。何の行も更新の影響を受けていないことを意味しています - 私が言ったのはまさに – Normal9ja

答えて

1

に接続するが、私は私は私が後でページエディタのURLがeditor.html?quote_id=1 たことを考え出し$this->quote_idを持っていた場所では私の問題 への答えを見つけたと思います私が提出したときにフラットなURLにフォームが処理されるようになりました=== editor.html私の間違いは、私がまだ編集URLにいたときにQUOTE IDを要求しなかったことでした。代わりにそれを要求しました。editor.html?quote_id=1すなわちeditor.htmlだから私は更新に成功したが実際には何も更新していない空の引用符を返すことになっていた だから 私は入力タグを追加しましたhi quote_idが編集されている取得するDDENし、フォーム

の残りの部分と一緒にそれを投稿だから、単純だが、私は私再読み込みの時間を取り、素晴らしい、コーディング再度、 小さなものは非常にフラストレーションに

おかげで、すべての

を引き起こします
+0

です!あなたができるときは、他の人があなたの成功から学ぶかもしれないようにあなたの答えを「受け入れられた」とマークしてください。乾杯〜 –

1

を使用してクエリのためにそれを使用することです更新ステートメントがいずれの行とも一致しない場合、updateステートメントは成功を返します。
ただし、何も変更されません。 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 

更新文が唯一の失敗は、エラーが発生したであることを示します。

SQLインジェクションについての警告
ダイナミックテーブルとカラム名が使用されています。
これらの値がユーザーによって変更可能であるか、ユーザーによって影響を受ける可能性がある別のPHPセッションの影響を受けるスーパーグローバルを通過する場合、SQLインジェクションホールがあります。ここで

はそのに対して自分自身を確保する方法は次のとおりです。How to prevent SQL injection with dynamic tablenames?

0

更新しているフィールドが同じでない場合は、データベース内のフィールドがあり、それが更新されません。それはテーブルを見ている成功の簡単な手段を返却し、データベース

関連する問題