0

我决定在我的程序中添加一个删除功能,但由于某种原因,DELETE FROM 不起作用。我提供了一些有用的代码,它们会有所帮助:

JavaScript:

function removeAgeGender(id) {
     console.log("Entering removeAgeGender");
     if (id == 'national age gender') {
         var data = $('[name="remove_age_gender[]"]').serialize();
         console.log(data);
         $.ajaxSetup({async:false});
         $.post('/CensusDatabase/database_scripts/NationalAgeGender.php', {remove_age_gender : data });
         nationalAgeGender();
     }
     if (id == 'arizona age gender') {
         var data = $('[name="remove_age_gender[]"]').serialize();
         $.ajaxSetup({async:false});
         $.post('/CensusDatabase/database_scripts/ArizonaAgeGender.php',  {remove_age_gender : data });
         arizonaAgeGender();
     }
}

PHP:

if(isset($_POST['remove_age_gender'])) {
    $boxData = $_POST['remove_age_gender'];
    $removeValue = array();
    parse_str($boxData, $removeValue);
    removeRow($removeValue, $link);
}

function removeRow($removeValue, $link) {
    $removeValue = $removeValue['remove_age_gender'];
    $value = $removeValue[0];
    $query = "DELETE FROM national_age_gender_demographics WHERE age_group='$value'";
    $escapedQuery = mysqli_real_escape_string($query);
    $result = mysqli_query($link,$escapedQuery);
    if(!$result)  die( "Query: " . $escapedQuery . "\nError:" . mysql_error() );
}

有谁知道我做错了什么?

4

2 回答 2

3

不要mysqli_real_escape_string查询上使用,而是在查询参数(即$value)上使用。您'作为列值的字符串文字语法的一部分被错误地转义,导致语法无效。

更好的是,您应该使用准备、绑定参数和执行:

$query = "DELETE FROM national_age_gender_demographics WHERE age_group = ?";
$stmt = mysqli_prepare($link, $query);
mysqli_stmt_bind_param($stmt, "s", $value);
mysqli_execute($stmt);
于 2013-05-02T21:54:31.183 回答
1

正如我上面所说。您不会逃避整个查询。那只会产生语法错误。这是正确的(但仍然是错误的)顺序:

$value = $removeValue[0];
$escaped = mysqli_real_escape_string($value);

$query = "DELETE FROM national_age_gender_demographics WHERE age_group='$escaped'";
$result = mysqli_query($link,$query);

考虑一下当您转义整个查询时会发生什么:所有 SQL 元字符都转义了,因此您实际上是在使查询成为:

DELETE FROM .... WHERE age_group=\'...\'

转义引号使它们不再是引号 - 它们只是变成纯文本,现在您正试图将您的age_group字段与名称为'somevalue'.

为了使这完全正确,您不应该自己转义数据。您使用准备好的语句和/或 SQL 占位符,例如

$stmt = mysql_prepare('DELETE FROM ... WHERE age_group=?');
$stmt->exec(array($value));

这是非功能代码,但应该给你基本的想法。除非你确切地知道你在做什么,否则你永远不会让原始数据进入 SQL 查询,除非它是通过占位符。

于 2013-05-02T21:53:58.887 回答