我有一个我无法解决的简单问题。我已经尝试使用谷歌搜索,但没有找到任何帮助。
基本上,我有一个有输入的PHP页面,输入是POST
到另一个PHP文件,后者又查询一些MySQL语句并使用第一个PHP页面中的信息更新数据库。 / p>
这是我的PHP格式:
<!DOCTYPE html lang="en">
<head>
<meta charset="utf-8">
<title>form page</title>
</head>
<body>
<form action="mainfileupdatetest.php" method="POST">
<p>
<label for="test">A:</label>
<input type="text" name="test" id="test">
<label for="test2">B:</label>
<input type="text" name="test2" id="test2">
<label for="test3">A:</label>
<input type="text" name="test3" id="test3">
<label for="test4">B:</label>
<input type="text" name="test4" id="test4">
</p>
<button type="submit" value="submit">
</form>
<?php
$mysqli->close();
?>
</body>
</html>
这是更新数据库的PHP文件:
<?php
$link = mysqli_connect("localhost", "root", "fakepassword", "fakedb");
if($link === false){
die("ERROR: Could not connect. " . mysqli_connect_error());
}
$test = mysqli_real_escape_string($link, $_REQUEST['test']);
$test2 = mysqli_real_escape_string($link, $_REQUEST['test2']);
$test3 = mysqli_real_escape_string($link, $_REQUEST['test3']);
$test4 = mysqli_real_escape_string($link, $_REQUEST['test4']);
$sql = "UPDATE mainfile SET A='$test', B='$test2' WHERE id='1'";
$sql = "UPDATE mainfile SET A='$test3', B='$test4' WHERE id='2'";
if(mysqli_query($link, $sql)){
echo "Records added successfully.";
} else{
echo "ERROR: Could not execute $sql. " . mysqli_error($link);
}
mysqli_close($link);
?>
没有弹出的PHP或MySQL错误,但是当我将信息输入到表单中时,只有某些错误会被MySQL保存到数据库中。
这是在PHPMyAdmin上看到的表:
(旁边的问题,为什么submit
按钮显示我给它的名字?[value:submit
])
但是在数据库上:
发生这种情况。有人能够启发我吗?
答案 0 :(得分:0)
是的,您正在一行中收集HTML表单中2个数据库行的数据,看起来您希望使用这4个字段来修改数据库中的2个不同的行。
您的问题是,在您将其中一个查询实际提交到数据库之前,您正在编写其中一个查询。
您的代码也对SQL Injection Attack敞开了 甚至if you are escaping inputs, its not safe! 使用prepared parameterized statements
所以我把它改为使用准备好的,参数化的和绑定的语句。
<?php
$link = mysqli_connect("localhost", "root", "fakepassword", "fakedb");
if($link === false){
die("ERROR: Could not connect. " . mysqli_connect_error());
}
/* bad unsafe
$test = mysqli_real_escape_string($link, $_REQUEST['test']);
$test2 = mysqli_real_escape_string($link, $_REQUEST['test2']);
$test3 = mysqli_real_escape_string($link, $_REQUEST['test3']);
$test4 = mysqli_real_escape_string($link, $_REQUEST['test4']);
*/
// One prepared query will do for both update commands
$sql = "UPDATE mainfile SET A=?, B=? WHERE id=?";
$stmt = $link->prepare($sql);
// bind the first set of values to the query
$stmt->bind_param('ssi', $_REQUEST['test'],
$_REQUEST['test2'],
1);
// and execute the query
$stmt->execute();
// Check for errors
if ( !$link->error ) {
echo "FIRST row Updated.";
} else{
echo "ERROR: Could not execute $sql. " . mysqli->error;
}
// bind second set of data to the query
$stmt->bind_param('ssi', $_REQUEST['test3'],
$_REQUEST['test4'],
2);
// execute the query
$stmt->execute();
// Check for errors
if ( !$link->error ) {
echo "SECOND row Updated.";
} else{
echo "ERROR: Could not execute $sql. " . mysqli->error;
}
?>
你可以在一个循环中完成这个,但为了保持简单,希望更容易遵循我只是做了一切简单
答案 1 :(得分:-2)
当您使用相同的变量$ sql时,例如:
1)$sql = "UPDATE mainfile SET A='$test', B='$test2' WHERE id='1'";
2)$sql = "UPDATE mainfile SET A='$test3', B='$test4' WHERE id='2'";
并在$sql
上执行mysqli_query()
变量,如:
if(mysqli_query($link, $sql)){ echo "Records added successfully."; }
else{ echo "ERROR: Could not execute $sql. " . mysqli_error($link); }
所以第二个udate查询将起作用。
2)$sql = "UPDATE mainfile SET A='$test3', B='$test4' WHERE id='2'";
答案 2 :(得分:-4)
$sql = "UPDATE prob1 SET A='$test', B='$test2' WHERE id='1';";
$sql .= "UPDATE prob1 SET A='$test3', B='$test4' WHERE id='2';";
if(mysqli_multi_query($link, $sql)){
echo "Records added successfully.";
} else{
echo "ERROR: Could not execute $sql. " . mysqli_error($link);
}