sql >> データベース >  >> RDS >> Mysql

PDOはテーブルから指定された行を削除します

    実際、ここに表示されているコードだけでは、ここにいる人は誰もこれに答えることができません。しかし、@ultranautと@devJunkはどちらもかなりそれを釘付けにしました。私が最初に関数を作成したとき、フォームはユーザーがデータベースにレコードを追加することを許可し、[すべての作業履歴をクリア]ボタンがありましたが、個々のレコードを削除する方法はありませんでした。

    私は次のように関数を書きました:

    • 文字列値を渡す'all' $rowIdとして パラメータはすべてのレコードを削除します(これはアプリケーションが必要とするものです)
    • データベースの行IDを$rowIdとして渡す パラメータはその特定の行だけを削除します(その時点では必要ありませんが、追加するのは理にかなっています)

    一度にすべてを削除するためのボタンは1つしかなかったので、私はこのチェックでそれを実装しただけです:

    if(isset($_POST['clear_work'])){
            // see explanation of params in function declaration above for `deleteFromWhere()`
            deleteFromWhere($db,'work',$_SESSION['username'],'all');    
    }
    

    特定のレコードを削除する場合は、次の2つのことを行う必要があります。

    最初のページに、個々のレコードを削除するボタンなどを追加します。

    <form action="addCV.php" method="post"> 
        <input type="hidden" value="12345" name="clear_this_work" /><!--you'll need to set the value here to the database row id of the currently displayed record -->                  
        <input type="submit" value="Clear This Work Record" style="border: 1px solid #006; color:#F87F25; font: bold 16px Tahoma; border-radius:7px; padding:4px; background:#ffffff;"/>
    </form> 
    

    2ページ目にチェックを追加して、このボタンが押されたかどうかを確認し、指定されたIDを渡す関数を呼び出します。

    if(isset($_POST['clear_this_work'])){
            // see explanination of params in function declaration above for `deleteFromWhere()`
            deleteFromWhere($db,'work',$_SESSION['username'],$_POST['clear_this_work']);    
    }   
    

    最終修正php:

    // a function that deletes records 
    // $table is the table to delete from
    // $user is the current username
    // $rowId is the row id of the record to be deleted
    // if $rowId is passed as the string "all", 
    // all matching records will be deleted 
    function deleteFromWhere($db,$table,$user,$rowId){
        // PDO will sanitize most vars automatically
        // however Table and Column names cannot be replaced by parameters in PDO. 
        // In this case we will simply want to filter and sanitize the data manually.
        // By leaving no default case or using a default case that returns an error message you ensure that only values that you want used get used.
        // http://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-name-as-parameter
        switch($table){
            case 'work':
                $tbl = 'work'; // add more here when you want to start deleting from other tables
                break;
        }
        if($rowId=='all'){ // delete all records
            $sql = 'DELETE FROM '.$tbl.' WHERE username=?';  // "?"s here will get replaced with the array elements below
            $stmt = $db->prepare($sql);
            $stmt->execute(array($user)); // these array elements will replace the above "?"s in this same order
            // check for errors 
            if($stmt->errorCode() == 0) {
                // no errors, show alert and refresh page
                return '<script type="text/javascript">alert("All work history was successfully cleared!"); window.location="addCV.php"; </script>';
            } else {
                // had errors
                $errors = $stmt->errorInfo();
                return '<script type="text/javascript">alert("Error deleting work history!: '.$errors[2].'"); window.location="addCV.php"; </script>';  
            }
        }
        elseif($rowId){ // delete specified row 
            $sql = 'DELETE FROM '.$tbl.' WHERE username = ? AND id = ?';  // "?"s here will get replaced with the array elements below
            $stmt = $db->prepare($sql);
            $stmt->execute(array($user,$rowId)); // these array elements will replace the above "?"s in this same order
            $affected_rows = $stmt->rowCount(); // get the number of rows affected by this change
            return $affected_rows.' row deleted.';
            // check for errors 
            if($stmt->errorCode() == 0) {
                // no errors, show alert and refresh page
                return '<script type="text/javascript">alert("Selected work history was successfully cleared!"); window.location="addCV.php"; </script>';
            } else {
                // had errors
                $errors = $stmt->errorInfo();
                return '<script type="text/javascript">alert("Error deleting work history: '.$errors[2].'"); window.location="addCV.php"; </script>';   
            }
        }
        else{ /// return error
        }
    }   
    
    
    if(isset($_POST['clear_work'])){
            // see explanation of params in function declaration above for `deleteFromWhere()`
            deleteFromWhere($db,'work',$_SESSION['username'],'all');    
    }
    
    // add the below check 
    if(isset($_POST['clear_this_work'])){
            // see explanination of params in function declaration above for `deleteFromWhere()`
            deleteFromWhere($db,'work',$_SESSION['username'],$_POST['clear_this_work']);    
    }   
    

    HTML:

    <form action="addCV.php" method="post">                         
        <input type="submit" value="Clear All Work History" name="clear_work" style="border: 1px solid #006; color:#F87F25; font: bold 16px Tahoma; border-radius:7px; padding:4px; background:#ffffff;"/>
    </form> 
    <!--  add the below -->
    <form action="addCV.php" method="post"> 
        <input type="hidden" value="12345" name="clear_this_work" /><!--you'll need to set the value here to the database row id of the currently displayed record -->                  
        <input type="submit" value="Clear This Work Record" style="border: 1px solid #006; color:#F87F25; font: bold 16px Tahoma; border-radius:7px; padding:4px; background:#ffffff;"/>
    </form> 
    



    1. mysqlの制限が崩壊し、データの相互作用が発生します

    2. LENGTHコマンドの奇妙な動作-ORACLE

    3. SQL:挿入したばかりの値のIDを取得するにはどうすればよいですか?

    4. すべてのSQL-SQLiteクエリをcaseステートメントで結合する方法は?