值未正确POST到数据库

时间:2018-02-18 06:53:25

标签: php mysql

我有一个我无法解决的简单问题。我已经尝试使用谷歌搜索,但没有找到任何帮助。

基本上,我有一个有输入的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上看到的表:

enter image description here

当我输入这样的信息时: enter image description here

(旁边的问题,为什么submit按钮显示我给它的名字?[value:submit])

我没有错误: enter image description here

但是在数据库上:

enter image description here

发生这种情况。有人能够启发我吗?

3 个答案:

答案 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);
}