-3

エラーなしで動作するスクリプトがありますが、mysql から選択した値を削除できません。次のように表示されます。

include('opendb.php');
$a = $_GET['new_pav'];
$select = mysql_query("SELECT * from naujiena WHERE new_pav = '$a'");
while($row = mysql_fetch_row($select)){
    $result = mysql_query("DELETE FROM `naujiena` WHERE new_pav='".mysql_real_escape_string($a)."' ");
}
4

2 に答える 2

1

まず、これ(および以下)を読んでください:

mysql_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に廃止されています。赤いボックスがか? 代わりにプリペアド ステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事は、どちらを使用するかを決めるのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。

赤い警告ボックスはmysql_*、新しいものへの使用を中止するように伝えています。

クエリに関してDELETE FROM x WHERE y=zは、有効なクエリであるため、エラーは引用符の使用に起因する可能性があります(new_pavがintの場合、これで説明できます); 文字列は MySQL で引用されます。

また、SQL クエリで文字列を補間/連結しないでください。SQL インジェクションの危険があります。pdo を検索し変数や無数の関数ではなく、状態 (db 接続) に関連するクラスの使用を開始します。(私はもともとここでmysqliを使用していました):

try {
    $db = new PDO("mysql:dbname=$dbname;host=$dbhost", $dbuser, $dbpass);
    $query = $db->prepare("SELECT COUNT(*) FROM naujiena WHERE new_pav = :pav");

    if (!$query->bindParam(":pav", $_POST["new_pav"])) {
        die("Input incorrect; couldn't bind");
    }

    $query->execute();
    $rows = $query->fetchColumn(0); // fetch a single column. count(*) here.

    if ($rows !== 0) { // It has a result~
        $query = $db->prepare("DELETE FROM naujiena WHERE new_pav = :pav");
        $query->execute(array(":pav" => $_POST["new_pav"]));
    }
    $db = null; // explicitly close connection

} catch (PDOException $e) { // catch any exception PDO throws at you.
    // note that you should catch where appropriate.
    die("Connection Failed: " . $e->getMessage());
}

SQL インジェクションを' OR 1=1 --使用すると、テーブル全体を入力して削除できることに注意してください。

ご覧のとおり、これは 1/2 ライナーではありませんが、自分でハードコーディングしていない SQL に追加されたものを決して信頼してはなりません。

于 2013-03-09T00:17:27.313 に答える
0

ライブラリを使用する以外にmysql_、コード:

$select = mysql_query("SELECT * from naujiena WHERE new_pav = '$a'");
while($row = mysql_fetch_row($select)){
    $result = mysql_query("DELETE FROM `naujiena` WHERE new_pav='".mysql_real_escape_string($a)."' ");
}

ではSELECT値をエスケープしていません$aが、削除ではエスケープしています。

とにかく、削除を行っているだけの場合は、SELECTorwhileループは必要ありません。したがって、次のコードを使用できます。

$result = mysql_query("DELETE FROM `naujiena` WHERE new_pav='".mysql_real_escape_string($a)."' ");
于 2013-03-09T08:29:10.790 に答える