2013-08-23 239 views
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,名称,电子邮件列组成。

的形式如下:

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

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

+2

建议,[**唐”在新代码中使用'mysql_ *'函数**](http://bit.ly/phpmsq L)。他们不再被维护[并且被正式弃用](http://j.mp/XqV7Lp)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果你选择PDO,[这里是一个很好的教程](http://j.mp/PoWehJ)。 –

+1

id列是否自动递增? – Paddyd

回答

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

+0

问题在于引用 – donald123

+0

Yah我编辑过看过一次 – Gautam3164

+0

可能是一个想法,确保在插入空值之前该列是auto_increment – Anigel

0

查询中的语法不正确!

这样写:

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

希望它能帮助!

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

,以防止注射

0

你的查询应该像现在这样,

<?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']."')";  
?> 
0

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

而且,是id一个auto_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

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

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

?>