【问题标题】:SQL Can't Delete from TableSQL 无法从表中删除
【发布时间】:2021-09-12 10:26:58
【问题描述】:

我有一个 PHP,我想做 2 次插入和 1 次删除,但我只能进行一次插入。如果数组包含最后一个参数 == "historico" 应该从instant_table 中删除所有具有相同serial_num 的寄存器并将数组插入instant_table 并插入history_table("SensorData")。如果不是(数组没有参数“historico”),应该从instant_table 中删除所有具有相同serial_num 的寄存器,并且只将数组插入instant_table。

我的代码:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $serial_numb = test_input($_POST["serial_numb"]);
    $DHTtempC = test_input($_POST["DHTtempC"]);
    $DHThumid = test_input($_POST["DHThumid"]);
    $CCS811_CO2 = test_input($_POST["CCS811_CO2"]);
    $CCS811_tVOC = test_input($_POST["CCS811_tVOC"]);
    $PM25 = test_input($_POST["PM25"]);
    $PM10 = test_input($_POST["PM10"]);
    $reading_date = date("Y-m-d");
    $update_status = test_input($_POST["update_status"]);
    $tipo_tabla = test_input($_POST["tipo_tabla"]);

        
    // Create connection
    // Check connection
    if ($mysqli->connect_error) {
        die("Connection failed: " . $mysqli->connect_error);
    } 
    if ($tipo_tabla == "historico"){
        $sql = "INSERT INTO SensorData (serial_numb, DHTtempC, DHThumid, CCS811_CO2, CCS811_tVOC, PM25, PM10, reading_date, update_status)
        VALUES ('" . $serial_numb . "', '" . $DHTtempC . "', '" . $DHThumid . "', '" . $CCS811_CO2 . "', '" . $CCS811_tVOC . "', '" . $PM25 . "', '" . $PM10 . "', '" . $reading_date . "', '" . $update_status . "')";  
    }
    $sql = "DELETE FROM instant_data WHERE (serial_numb = '" . $serial_numb . "')";    
    $sql = "INSERT INTO instant_data (serial_numb, DHTtempC, DHThumid, CCS811_CO2, CCS811_tVOC, PM25, PM10, reading_date, update_status)
    VALUES ('" . $serial_numb . "', '" . $DHTtempC . "', '" . $DHThumid . "', '" . $CCS811_CO2 . "', '" . $CCS811_tVOC . "', '" . $PM25 . "', '" . $PM10 . "', '" . $reading_date . "', '" . $update_status . "')";
        
    if ($mysqli->query($sql) === TRUE) {
            echo "New record created successfully";
    } 
    else {
            echo "Error: " . $sql . "<br>" . $mysqli->error;
    }

    if ($mysqli->connect_error) {
        die("Connection failed: " . $mysqli->connect_error);
    } 
    
    $mysqli->close();
}


else {
    echo "No data posted with HTTP POST.";
}

function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
    

总结一下,如果数组中包含参数,INSERTE(TABLE1) + DELETE 同serial_num(TABLE2) + INSERTE(TABLE2)。如果不是 DELETE 与相同的 serial_num(TABLE2) + INSERTE(TABLE2)。

编辑:现在这段代码只进行第二次插入

【问题讨论】:

  • 学习使用参数!使用参数值修改查询字符串只会使代码容易受到 SQL 注入攻击和莫名其妙的语法错误。
  • 数组是由 arduino 发送给我的,我在其中将参数添加到数组的末尾。
  • 您是在执行这些查询还是每次都覆盖$sql?
  • 你从不执行'$sql'中的查询,请显示你所有的代码
  • 使用所有代码编辑

标签: php mysql sql


【解决方案1】:

您似乎正在覆盖$sql 的内容,而没有执行其间的查询。您必须:

  • 在重新定义$sql之前执行每个查询
  • 使用$sql .=(而不是$sql =)连接下一个查询。如果这样做,您必须在连接下一个查询之前使用 ; 终止您的 sql 查询。

您是仅将此代码用于小型个人项目,还是打算以任何方式发布?如果是后者: 请阅读 PHP SQL 最佳实践。使用您当前的方法,您很容易受到 SQL 注入的攻击,并且您的代码有点难以阅读。

【讨论】:

  • 谢谢 Daniel,我如何在重新定义之前执行每个查询?与$mysqli-&gt;query($sql)?编辑:我试过 $mysqli->query($sql) 并且可以工作,但现在我在数据库中为每个表记录了两个 INSERTS
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
相关资源
最近更新 更多