我正在制作一个在线连接到数据库的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();
?>
答案 0 :(得分:1)
首先,这个PHP代码很容易受到sql注入攻击,无需更新代码即可使用mysqli prepared statement或PDO prepared statement
其次,我知道你实现目标的最简单方法是对某些列进行唯一约束,然后使用mysql功能ON DUPLICATE UPDATE
对于此示例,我将假设确定更新而不是插入的唯一字段为patient_name
,check_in_date
,room_number
和bed_number
(如果是约翰史密斯和约翰史密斯在单独的床上在同一个房间里)更新表的查询将是这样的
ALTER TABLE `patients` ADD UNIQUE `unique_index`(`patient_name`, `check_in_date`, `room_number`, `bed_number`);
所以现在要解决sql注入位和查询,我将更新示例以使用mysqli statement
并假设patient_name
和notes
是字符串(varchar / nvarchar), room_number
和bed_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与预处理语句和参数一起使用。
答案 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;
}