完整性检查 - 为什么这个PHP MySql插入不起作用?

时间:2014-02-16 17:14:10

标签: php mysql forms

您是否可以扫描下面的代码,找出表单未成功将记录插入MySql表'用户'的原因?

insert.php:

<?php // insert.php
require_once 'login.php';
$con = mysqli_connect($db_hostname, $db_username, $db_password, $db_database);
// Check connection
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySql: " . mysqli_connect_error();
}

$sql = "INSERT INTO users (name, email)
VALUES
('$_POST[name]]','$_POST[email]')";

if (!mysqli_query($con,$sql))
{
    die('Error: ' . mysqli_error($con));
}
echo "1 record added";

mysqli_close($con;)
?>

的index.html:

<html>
<body>
<h1>Hello!</h1>

<form action="insert.php" method="post">
Name: <input type="text" name="name">
Email <input type="text" name="email">
<input type="submit">
</form>

</body>
</html>

登录凭证存储在单独的login.php文件中。 谢谢!

3 个答案:

答案 0 :(得分:2)

这里有一个额外的方括号

 ('$_POST[name]]',
               ^------- //Remove this from your SQL Query

您需要认真切换到PreparedStatements,因为您的上述代码直接倾向于SQL注入。

答案 1 :(得分:0)

尝试做: VALUES('“。$ $ POST [name]。”','“。$ _ POST [email]。”')“; 所以......使用mysqli_real_escape_string进行sql注入: 例: $ name = mysqli_real_escape_string($ _ POST ['name']);

它是mysqli_close($ con);不是mysqli_close($ con;)

答案 2 :(得分:0)

首先,这一行mysqli_close($con;)有一个错位的分号,应该是mysqli_close($con);

错字与否,它是以这种方式发布的,但我不打赌我的底部美元。

另外,您现有的方法对SQL injection开放。

$_POST[name]]中有一个轻微的语法错误,应该读作$_POST[name]但正如Patrick Evans在comment中所述:

“虽然这是一个错字,但它不会导致sql失败,它只会在列的名称末尾添加一个]。”

请改用此方法:( PDO ) - 它更安全。

<?php
/* Your Database Credentials */
$dbname = 'your_database';
$username = 'username';
$password = 'password';

$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "INSERT INTO users (name,
        email

        ) VALUES (
        :name, 
        :email)";

$stmt = $pdo->prepare($sql);

$stmt->bindParam(':name', $_POST['name'], PDO::PARAM_STR);       
$stmt->bindParam(':email', $_POST['email'], PDO::PARAM_STR); 

$stmt->execute(array(':name' => $_POST['name'],':email' => $_POST['email']));
if($stmt != false) {
    echo "Success!";
} else {
    echo "An error occured saving your data!";
}

?>

现有的,只需做一些修改:

<?php // insert.php
require_once 'login.php';
$con = mysqli_connect($db_hostname, $db_username, $db_password, $db_database);
// Check connection
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySql: " . mysqli_connect_error();
}

$name=mysqli_real_escape_string($con,$_POST['name']);
$email=mysqli_real_escape_string($con,$_POST['email']);

$sql = "INSERT INTO users (name, email)
VALUES
('$name','$email')";

if (!mysqli_query($con,$sql))
{
    die('Error: ' . mysqli_error($con));
}
echo "1 record added";

mysqli_close($con);
?>