>我在所有$rows
旁边列出了一个删除链接,当我将鼠标悬停在它们上时,它们反映了要删除的正确id,但是,当我单击DELETE
时,我被重定向到phpfile.php?id=4
,例如,没有删除任何内容,没有发布任何错误。
while ($row = mysqli_fetch_array($r,MYSQLI_ASSOC))
{
echo '<tr><td align="left">' .
$row['title'] . '</td><td align="left">'
. $row['genre'] . '</td><td align="left">'
. $row['length'] . '</td><td align="left">'
. $row['created'] . '</td><td align="left">'
. $row['views'] . '</td><td align="left">'
. "<a href='newwriter_profile.php?id={$row['upload_id']}'>Delete</a></td>" . '</tr>';
}
echo '</table>'; // Close the table
代码的其余部分,存在于同一页面上:
if(isset($_GET['id'])) {
// Get the ID
$id = intval($_GET['upload_id']);
require_once ('../mysqli_connect.php'); //Connect to the db
$delquery = "
DELETE
FROM upload
WHERE upload_id = {$id}";
$done = @mysqli_query ($dbc, $delquery); // Run the query
if($done) {
// Make sure the result is valid
if (mysqli_num_rows($done)==1) {
echo 'Record Deleted';
}
else {
echo 'error - delete failed';
}
// Free the mysqli resources
@mysqli_free_result($result);
}
else {
echo "Error! Query failed:" .$mysqli_error($dbc);
}
mysqli_free_result($done);
mysqli_close($dbc);
}
如果我能解决这个错误,我将解决一个类似的错误,除了使用下载功能。
当您打算使用$_GET['id']
时,您正在从不存在的$_GET['upload_id']
中提取$id
。 由于未设置$_GET['upload_id']
,因此其值为 NULL
,这被解释为 0。 您的查询最终为:DELETE FROM upload WHERE upload_id = 0
$id = intval($_GET['upload_id']);
// Should be
$id = intval($_GET['id']);
与其使用intval()
,我建议对$id
使用更广泛的边界检查。例如,如果在 ?id=abc
中传递像 "abc"
这样的字符串,intval("abc")
会将其转换为 0,而您将 0 传递到查询中。 如果id
需要为正整数,请使用如下内容:
if (ctype_digit($_GET['id'])) {
// ok, do your query
}
else {
// invalid input, report error to user and don't touch your database.
}
最后,我们看不到脚本的其余部分,但在使用超链接执行删除操作(或与此相关的任何操作(时,在完成操作之前检查尝试删除的行的所有权通常至关重要。 确保登录用户有权删除该行,如果没有,请不要执行任何数据库操作。否则,任何用户都可以将任何值传递到 URL 中以修改其他人的数据。 推荐阅读: 末日蜘蛛