0

想知道是否有人可以提供帮助。我试图从表单中收集数据并将其插入数据库,但我一直收到此错误:

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、name、email 列组成。

表格如下:

<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);
}
?>

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

4

7 回答 7

1

试试喜欢

$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.

于 2013-08-23T10:41:59.020 回答
0

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

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

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

<?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_*在新代码中使用函数。它们不再被维护并被正式弃用。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 PDO,这里有一个很好的教程

于 2013-08-23T11:14:17.403 回答
0

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

而且,是id因为auto_increment如果是,那么您应该一起排除该字段

IE:

$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

于 2013-08-23T10:48:22.657 回答
0

查询中的语法不正确!

像这样写:

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

希望能帮助到你!

于 2013-08-23T10:45:36.010 回答
0

你不能像那样使用 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'])."')"

防止注射

于 2013-08-23T10:46:08.847 回答
0

使用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[] */
}

?>
于 2014-03-27T07:10:41.100 回答
-1

您的查询应该是这样的,

<?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']."')";       
?>
于 2013-08-23T10:47:49.120 回答