插入问题


INSERT INTO problems

想知道是否有人能帮忙。我试图从表格中收集数据并将其插入数据库,但我一直收到这个错误:

Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:'xampp'htdocs'test'form.php on line 49该表由id、名称和电子邮件列组成。

表格如下:

<form  action="" method="post">
    Name *: <input type="text" name="name"><br/>
    Email *: <input type="text" name="email"><br/>
    <input  type="submit"  value="Submit">
</form>

PHP脚本:

<?php
if (isset($_POST['submit'])) {
    $con = mysql_connect('localhost', 'root', '****');
    if($con) {
        die("Can''t connect");
    }
    mysql_select_db('email_database', $con);
    $sql = "INSERT INTO client_data (id, name, email) VALUES ('', '$_POST['name']', '$_POST['email']')";
    mysql_query($sql, $$con);
    mysql_close($con);
}
?>

我不知道我做错了什么:/提前感谢

像一样尝试

$sql = "INSERT INTO client_data (id, name, email)  
        VALUES (NULL, '".$_POST['name']."', '".$_POST['email']."')";

如果它是一个自动递增字段,那么无需像一样提及它

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

并且尽量避免使用mysql_*语句,因为整个ext/mysql PHP扩展提供了所有以前缀mysql_*命名的函数,从PHP v5.5.0开始,该扩展已被正式弃用,并且将来将被删除。

还有另外两个MySQL扩展可以更好地使用:MySQLiPDO_MySQL,它们中的任何一个都可以用来代替ext/mysql

你不能那样使用assoc数组!你必须这样做:

$sql = "INSERT INTO client_data (id, name, email) VALUES ('', '".$_POST['name']."', '".$_POST['email']."')"

更好的是:

$sql = "INSERT INTO client_data (id, name, email) VALUES ('', '".mysql_real_escape_string($_POST['name'])."', '".mysql_real_escape_string($_POST['email'])."')"

防止注射

您的单引号和双引号有问题。

但是,idauto_increment吗?因为如果是,那么您应该将该字段一起排除在之外

即:

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

如果不是:

$sql = "INSERT INTO client_data (id, name, email) VALUES ('', '" . mysql_real_escape_string($_POST['name']) . "', '" . mysql_real_escape_string($_POST['email']) . "')";

mysql_real_escape_string应用于任何用户输入或可编辑的数据。

然而,正如其他人可能提到的那样:您真的应该考虑将您的mysql调用升级为类似mysqli_*或PDO_mysql 的东西

查询中的语法不正确!

这样写:

'".$_POST["name"]."'

希望它能有所帮助!

使用MySQLi,而不是不推荐使用MySQL:

您的PHP脚本应该如下所示:

<?php
if (isset($_POST['submit'])) {
$con=mysqli_connect("localhost","root","****","email_database");
if(mysqli_connect_errno()){
echo "Error".mysqli_connect_error();
}
mysqli_query($con,"INSERT INTO client_data (id, name, email) VALUES ('', '$_POST[name]', '$_POST[email]')"); /* YOU SHOULD HAVE REMOVED THE SINGLE QUOTE (') INSIDE $_POST[] */
}
?>

除了明显的语法错误和SQL注入/转义问题外,您的未验证用户输入或错误处理。

不幸的是,这种没有保护的做法;你发现你的数据库很快就充满了伟哥、廉价手表、服装关键词和XSS代码。

下面是一个使用PDO准备的查询的端口/示例。使用更安全的代码,为了使任何表单更加安全,您应该添加一个captcha:

<?php 
session_start();
try {
    $db = new PDO('mysql:host=127.0.0.1;dbname=email_database','root','****');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $db->exec("SET CHARACTER SET utf8");
} catch(PDOException $e) {
    echo 'Database connection error :' . $e->getMessage();
}
if($_SERVER['REQUEST_METHOD'] === 'POST'){
    //csrf token
    if(!isset($_SESSION['token']) || !isset($_POST['token']) || $_SESSION['token'] != $_POST['token']) 
    exit('Invalid request token');
    //Validate input values
    $error = array();
    //Name
    if(empty($_POST['name'])){
        $error['name'] = "Your name is required";
    }
    //Email
    if(!empty($_POST['email'])){
        if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
            $error['email'] = "A Valid email is required";
        }
    }else{
        $error['email'] = "Your email is required";
    }
    //ok no error lets insert
    if(empty($error)){
        $sql = 'INSERT INTO client_data (name, email) VALUES (:name, :email)';
        $stmt = $db->prepare($sql);
        $stmt->bindParam(':name',  $_POST['name']);
        $stmt->bindParam(':email', $_POST['email']);
        $stmt->execute();
    }
    //Token used for this request, remove
    unset($_SESSION['token']);
}
//set csrf token
$_SESSION['token'] = hash('sha256', uniqid());
?>
<form action="" method="POST">
    <input type="hidden" name="token" value="<?php echo $_SESSION['token'];?>"/>
    Name *: <input type="text" name="name"/> <?php echo isset($error['name']) ? $error['name'] : null;?><br/> 
    Email *: <input type="text" name="email"/> <?php echo isset($error['email']) ? $error['email'] : null;?><br/> 
    <input type="submit" value="Submit"/> 
</form>

不要在新代码中使用mysql_*函数。它们不再被维护,并被正式弃用。是否看到红框?了解准备好的语句,并使用PDO或MySQLi-本文将帮助您决定哪一个。如果你选择PDO,这里有一个很好的教程。

您的查询应该是这样的,

<?php
$sql = "INSERT INTO client_data (id, name, email) VALUES ('', '".$_POST['name']."', '".$_POST['email']."')";       
?>

最好将ID字段设置为自动递增字段。那么你的查询会是,

<?php
    $sql = "INSERT INTO client_data (name, email) VALUES ('".$_POST['name']."', '".$_POST['email']."')";       
?>