想知道是否有人可以提供帮助。我试图从表单收集数据并将其插入数据库,我怎么会一直收到这个错误:
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);
}
?>
我不知道我做错了什么:/ 提前致谢
答案 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
扩展程序:MySQLi
和PDO_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)
您的单引号和双引号存在问题。
但是,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
应该用于任何用户输入或编辑的数据。
答案 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,并使用PDO或MySQLi - 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']."')";
?>