0

有没有一种方法可以在每次访问时使用相同的 php 文件“favorite.php”来执行两个单独的 mysql 查询。

基本上,我在用户个人资料页面上有一个链接,称为添加到收藏夹,它链接到 favorite.php 并运行查询以将用户添加到会话用户收藏夹列表中。我想在文件中添加另一个查询以在单独的场合运行,所以下次单击链接时说表中是否存在收藏夹 ID 以删除它,从会话用户收藏夹列表中删除该用户?

在这里,我将插入到查询中,现在我只需要找到一种方法来说删除最喜欢的 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 回答