0

同じ php ファイル 'favorite.php' を使用して、アクセスするたびに 2 つの別々の mysql クエリを実行する方法はありますか?

基本的に、お気に入りに追加と呼ばれるユーザー プロファイル ページにリンクがあります。これは、favorite.php にリンクし、クエリを実行してユーザーをセッション ユーザーのお気に入りリストに追加します。ファイルに別のクエリを追加して別の機会に実行したいので、次回リンクをクリックして、お気に入りの ID がテーブルに存在するかどうかを確認して削除し、そのユーザーをセッション ユーザーのお気に入りリストから削除しますか?

ここにクエリへの挿入がありますが、リンクが2回クリックされたときにお気に入りのIDが存在する場合は削除する方法を見つける必要がありますか?

<?php

require_once('includes/session.php');
require_once('includes/functions.php');
require('includes/_config/connection.php');


session_start();


    confirm_logged_in();




    if (isset ($_GET['to'])) {
    $user_to_id = $_GET['to'];


}


if (!isset($_GET['to']))
    exit('No user specified.');

$user_id = $_GET['to'];

$result = mysql_query("INSERT INTO ptb_favorites (user_id, favorite_id) VALUES (".$_SESSION['user_id'].", ".$user_to_id.")") 
or die(mysql_error()); 

if($result = mysql_query($query))

$result = mysql_query("DELETE FROM ptb_favorites (user_id, favorite_id) VALUES (".$_SESSION['user_id'].", ".$user_to_id.")") 
or die(mysql_error()); 

header("Location: profile.php?id=" . $user_to_id['user_id']);


?>

それが理にかなっていることを願っています。

4

2 に答える 2

1

PHP 5.3 以降を使用していると仮定して、SQL インジェクションを回避するためにスクリプトを作成する方法を次に示します。私はデータベース クエリにクロージャ/匿名関数を使用する傾向がありますが、他のすべてのものとインラインで使用できます。

$_GET['to']ただし、最後の行は、配列でない限り混乱しています。

<?php

require_once('includes/session.php');
require_once('includes/functions.php');

$connection = new PDO('mysql:host=example.com;dbname=you_database_name', 'mysql_username', 'mysql_pass');

session_start();
confirm_logged_in();

$user_to_id = isset($_GET['to']) ? $_GET['to'] : null;

if (is_null($user_to_id)) {
    exit('No user specified.');
}

$user_id = $_GET['to'];

$insert = (function () use ($connection, $user_to_id) {
    $sql = "INSERT INTO ptb_favorites (user_id, favorite_id) VALUES (?, ?)";
    $statement = $connection->prepare($sql);

    $result = $statement->execute(array(
        $_SESSION['user_id'],
        $user_to_id
    ));

    return $result;
});

if ($insert() === true) {
    $delete = (function () use ($connection, $user_to_id) {
        $sql = "DELETE FROM ptb_favorites WHERE user_id = ? AND favorite_id = ?";
        $statement = $connection->prepare($sql);

        $result = $statement->execute(array(
            $_SESSION['user_id'],
            $user_to_id
        ));

        return $result;
    });

    $delete();
}

// Not sure about this line if $user_to_id is not an array
header("Location: profile.php?id=" . $user_to_id['user_id']);
于 2012-12-27T03:43:46.633 に答える
0

ステートメントを作成するときは、キーワードを含めDELETEないでください。VALUES

DELETE 
FROM ptb_favorites 
WHERE user_id = val1 AND
      favorite_id = val2

そうでPHP

$delQuery = "    DELETE 
                 FROM ptb_favorites 
                 WHERE user_id = '" . $_SESSION['user_id'] . "' AND
                       favorite_id = '" . $user_to_id . "'"
$result = mysql_query($delQuery) or die(mysql_error());

補足として、クエリはSQL Injection. 予防方法については、以下の記事をご覧ください。PreparedStatements を使用すると、値を一重引用符で囲む必要がなくなります。

于 2012-12-27T03:04:57.013 に答える