PHP不会从MySQL中删除

Mic*_*ski 3 javascript php mysql

出于某种原因,JavaScript/PHP不会从MySQL中删除我的数据!这是问题的破败.


我有一个数组,以一种很好的格式显示我所有的MySQL条目,并带有一个按钮,可以单独删除每个条目的条目.它看起来像这样:

<?php

            include("login.php");

        //connection to the database
        $dbhandle = mysql_connect($hostname, $username, $password)
         or die("<br/><h1>Unable to connect to MySQL, please contact support at support@michalkopanski.com</h1>");

        //select a database to work with
        $selected = mysql_select_db($dbname, $dbhandle)
          or die("Could not select database.");

        //execute the SQL query and return records
        if (!$result = mysql_query("SELECT `id`, `url` FROM `videos`"))
        echo 'mysql error: '.mysql_error();

        //fetch tha data from the database
        while ($row = mysql_fetch_array($result)) {
           ?>

       <div class="video"><a class="<?php echo $row{'id'}; ?>" href="http://www.youtube.com/watch?v=<?php echo $row{'url'}; ?>">http://www.youtube.com/watch?v=<?php echo $row{'url'}; ?></a><a class="del" href="javascript:confirmation(<? echo $row['id']; ?>)">delete</a></div>

<?php }

//close the connection
mysql_close($dbhandle);
?>
Run Code Online (Sandbox Code Playgroud)

删除按钮的href为javascript:confirmation(<? echo $row['id']; ?>),所以一旦你点击删除,它就会运行:

<script type="text/javascript">
<!--
function confirmation(ID) {
    var answer = confirm("Are you sure you want to delete this video?")
    if (answer){
        alert("Entry Deleted")
        window.location = "delete.php?id="+ID;
    }
    else{
        alert("No action taken")
    }
}
//-->
</script>
Run Code Online (Sandbox Code Playgroud)

从理论上讲,JavaScript应该将'ID'传递给页面delete.php.该页面看起来像这样(我认为这就是问题所在):

<?php

include ("login.php");

mysql_connect($hostname, $username, $password)
 or die("Unable to connect to MySQL");

mysql_select_db ($dbname)
or die("Unable to connect to database");

mysql_query("DELETE FROM `videos` WHERE `videos`.`id` ='.$id.'");
echo ("Video has been deleted.");
?>
Run Code Online (Sandbox Code Playgroud)

如果有人可能知道答案,我会非常感激.我也接受了建议(对于那些不确定的人).

谢谢!

Pas*_*TIN 14

在您的delete.php脚本中,您正在使用以下行:

mysql_query("DELETE FROM `videos` WHERE `videos`.`id` ='.$id.'");
Run Code Online (Sandbox Code Playgroud)

$id变量不存在:您必须从$_GET变量初始化它,如下所示:

$id = $_GET['id'];
Run Code Online (Sandbox Code Playgroud)

(这是因为您的页面是使用HTTP GET请求调用的 - 即参数在URL中传递)

此外,您的查询感觉很奇怪:相反:

mysql_query("DELETE FROM `videos` WHERE `videos`.`id` = '$id' ");
Run Code Online (Sandbox Code Playgroud)

即删除' .':你已经在一个字符串中,所以没有什么可以连接(PHP中的点运算符用于字符串的连接)


注意 :

  • 如果这在某些服务器上有效,那可能是因为 register_globals
    • 有关更多信息,请参阅使用Register Globals
    • 但请注意,此"功能"已被弃用,并且绝对不应使用!
      • 它会带来安全风险
      • 并且应该在PHP 6中消失 - 这将是一个很好的改变,即使它打破了几个旧的应用程序
  • 你的代码有一个很大的SQL注入漏洞:你应该$id在查询中使用它之前清理/过滤/转义!
    • 如果你video.id是一个字符串,这意味着使用mysql_real_escape_string
      • 如果您使用mysqli或PDO扩展,您还可以查看准备好的语句
    • 使用整数,您可以调用intval以确保实际获得整数.


所以,最后,我会说你应该使用看起来像这样的东西:

$id = $_GET['id'];
$escaped_id = mysql_real_escape_string($id);
$query = "DELETE FROM `videos` WHERE `videos`.`id` = '$escaped_id'";
// Here, if needed, you can output the $query, for debugging purposes
mysql_query($query);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 !