插入问题

时间:2013-08-23 10:41:13

标签: php mysql database

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

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

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

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

查询中的语法不正确!

像这样写:

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

希望它有所帮助!

答案 2 :(得分:0)

你不能使用那样的关联数组! 你必须这样做:

$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'])."')"

防止注射

答案 3 :(得分:0)

您的单引号和双引号存在问题。

但是,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

答案 4 :(得分: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>

Don't use mysql_* functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDOMySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial

答案 5 :(得分: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[] */
}

?>

答案 6 :(得分:-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']."')";       
?>