将Insert语句更改为PHP / MySQL中的更新语句

时间:2017-03-31 19:58:20

标签: php mysql

我正在制作一个在线连接到数据库的Android应用程序,让用户可以从应用程序编辑数据库,我是PHP和MySql的新手,但是根据我的研究,我认为我应该使用UPDATE语句,I我已经编写了下面的代码来从教程中注册网站上的新用户,但我想将INSERT语句更改为UPDATE语句,以便应用程序更新我输入的现有数据,而不是注册新用户。 PHPMYADMIN,有人可以告诉我该怎么做吗?此外,如果您需要应用程序的代码在评论中提及它,我会将其添加到问题中,我不想发布太多不必要的代码。提前谢谢。

<?php
    require "conn.php";

    $patient_name = $_POST["patient_name"];
    $check_in_date = $_POST["check_in_date"];
    $room_number = $_POST["room_number"];
    $bed_number = $_POST["bed_number"];
    $notes = $_POST["notes"];

    $mysql_qry = "insert into patients(patient_name, check_in_date, room_number, bed_number, notes) values ('$patient_name', '$check_in_date', '$room_number', '$bed_number', '$notes')";

    if($conn->query($mysql_qry) === TRUE) {
        echo "Insert successful";
    }
    else{
        echo "Error: " . $mysql_qry . "<br>" . $conn->error;
    }
    $conn->close();
?>

修改

下面是固定代码,它现在更新数据库中已有的记录,而不是添加新数据。

<?php
    require "conn.php";

    $patient_name = $_POST["patient_name"];
    $check_in_date = $_POST["check_in_date"];
    $room_number = $_POST["room_number"];
    $bed_number = $_POST["bed_number"];
    $notes = $_POST["notes"];

    $mysql_qry = "UPDATE patients SET notes='$notes' WHERE patient_name='$patient_name'";

    if($conn->query($mysql_qry) === TRUE) {
        echo "Insert successful";
    }
    else{
        echo "Error: " . $mysql_qry . "<br>" . $conn->error;
    }
    $conn->close();
?>

3 个答案:

答案 0 :(得分:1)

首先,这个PHP代码很容易受到sql注入攻击,无需更新代码即可使用mysqli prepared statementPDO prepared statement

其次,我知道你实现目标的最简单方法是对某些列进行唯一约束,然后使用mysql功能ON DUPLICATE UPDATE

对于此示例,我将假设确定更新而不是插入的唯一字段为patient_namecheck_in_dateroom_numberbed_number(如果是约翰史密斯和约翰史密斯在单独的床上在同一个房间里)更新表的查询将是这样的

ALTER TABLE `patients` ADD UNIQUE `unique_index`(`patient_name`, `check_in_date`, `room_number`, `bed_number`);

所以现在要解决sql注入位和查询,我将更新示例以使用mysqli statement并假设patient_namenotes是字符串(varchar / nvarchar), room_numberbed_number是整数,check_in_date是日期

编辑我的原始答案在查询中出现语法错误,并且还将变量传递给下面的预准备语句是更新后的答案

$mysqliConn = new mysqli("localhost", "my_user", "my_password", "mydatabase");

$stmt = $mysqliConn->prepare("insert into patients
    (patient_name, check_in_date, room_number, bed_number, notes) 
    values (?, ?, ?, ?, ?) 
    ON DUPLICATE KEY UPDATE notes=values(notes)");

$patient_name = $_POST["patient_name"];
$check_in_date = $_POST["check_in_date"];
$room_number = $_POST["room_number"];
$bed_number = $_POST["bed_number"];
$notes = $_POST["notes"];

mysqli_stmt_bind_param($stmt, "sdiis", 
    $patient_name, $check_in_date, $room_number, $bed_number, $notes);

希望这会有所帮助

修改 关于唯一键,唯一键意味着唯一键中的所有字段在组合时必须是唯一的,因此对于上面的示例

如果记录1是 patient_name,check_in_date,room_number,bed_number,notes '约翰史密斯','3/1/2017',413,2,'病人生病' 并记录两个是 'jane doe','3/1/2017',413,2,'病人伤口'

这两条记录会与上述约束重复,但如果您确实需要更改约束,则可以执行以下操作

DROP the Constraint

ALTER TABLE `patients` DROP INDEX `unique_index`;

然后重新创建像这样的约束

ALTER TABLE `patients` ADD UNIQUE `unique_index`(`patient_name`, `check_in_date`, `room_number`);

如果您将约束命名为unique_index之外的其他内容,则可以通过运行以下命令找到key_name

SHOW INDEX FROM `patients`;

该名称将位于key_name

另外,如果您更改唯一约束以便更改床号,则可能需要在php中将查询的最后一行更改为此内容

ON DUPLICATE KEY UPDATE bed_number=values(bed_number), notes=values(notes)

答案 1 :(得分:0)

您也可以使用$(function() { var container = document.getElementById('visualization'); var items = new vis.DataSet({{documents|safe}}); var options = {}; var timeline = new vis.Timeline(container, items, options); timeline.on('select', function (properties) { $.getJSON('/getDependencyHistory', { uuid: properties.items[0] }, function(data) { console.log("Place this into the datatable"); }); return false; }); }); $(document).ready(function() { var table = $('#example').DataTable(); }); ,然后您不必更改SQL语句。让MySQL为你工作。

https://dev.mysql.com/doc/refman/5.7/en/replace.html

REPLACE INTO

此外,您应该真正了解如何将PDO与预处理语句和参数一起使用。

https://secure.php.net/manual/en/pdo.prepare.php

答案 2 :(得分:0)

实际上,我在寻找一个小的函数,可以将INSERT MySQL查询转换为UPDATE查询。所以也许其他人也在寻找相同的东西,我想这也是原始海报所寻找的……我找不到任何东西,所以我做了一个满足我需要的简单功能,当然,您必须确保您的原始作品查询从MySQL注入是安全的。

它将转换

  

插入aaa(bbb,ccc)值('111','222')

  

UPDATE aaa SET ccc ='222'WHERE bbb ='111'

使用第二个变量($ iColumn)标识WHERE语句。

function convertInsertToUpdate($sQuery, $iColumn = 1) {
$sNewQuery = "";
$iPos = strpos($sQuery, ' (');
$sTmpTable = substr($sQuery, 0, $iPos);
$iPos = strpos($sTmpTable, 'INSERT INTO ');
$sTmpTable = substr($sTmpTable, $iPos+12);
$iPos = strpos($sQuery, ') VALUES (');
$sTmpValues = substr($sQuery, $iPos+10);
$iPos = strrpos($sTmpValues, ')');
$sTmpValues = substr($sTmpValues, 0, $iPos);
$iPos = strpos($sQuery, '(');
$sTmpColumns = substr($sQuery, $iPos+1);
$iPos = strpos($sTmpColumns, ') VALUES (');
$sTmpColumns = substr($sTmpColumns, 0, $iPos);

$aColumns = explode(', ', $sTmpColumns);
$aValues = explode(', ', $sTmpValues);

if (count($aColumns)>0 && count($aColumns) == count($aValues) && $iColumn < (count($aValues)+1)) {
    $sNewQuery = "UPDATE ".$sTmpTable." SET";
    $sTmpWhere = "";
    $bNotFirst = false;
    $iX = 0;
    while ($iX<count($aColumns)) {
        if ($iColumn == ($iX+1)) {
            $sTmpWhere = " WHERE ". $aColumns[$iX]."=".$aValues[$iX];
            $iX++;
            continue;
        }
        if ($bNotFirst) {
            $sNewQuery .= ",";
        }
        $sNewQuery .= " ".$aColumns[$iX]."=".$aValues[$iX];
        $bNotFirst = true;
        $iX++;
    }
    $sNewQuery .= $sTmpWhere;
}
return $sNewQuery;
}