2013-12-17 37 views
0

所以即时通讯使用HTML表单发布信息到PHP,然后发送到数据库使用PHP脚本。但我不断收到$ first_name的意外变量(t_variable)的这个分析错误。这里是我的代码在phpMyAdmin IDPHP解析错误传递变量从表单到数据库

<?php 

$first_name = $_POST ['firstname']; 
$last_name = $_POST ['lastname']; 
$email = $_POST ['email']; 

$db_host = "localhost"; 
$db_username = "root"; 
$db_pass = "password"; 
$db_name = "db_name"; 

//connect to database 
@mysql_connect ("$db_host", "$db_username", "$db_pass") or die ("Unable to connect to  database at the moment. Please try again later.") ; 

//select the database to work with 
@mysql_select_db("$db_name") or die("No such database"); 


mysql_query("INSERT INTO users (id, first, last, email) VALUES ('', "$first_name", "$last_name", "$email") "); 

?> 

字段类型为int(25长) - 自动递增所以没有必要为它供给。 其他一切都是varchar(255长度)

注意:我已硬编码的值,它的工作,只是没有工作,当我尝试传递变量。此外,我已经尝试了没有引号的变量,它没有工作。

我该如何解决这个问题?

感谢

FIXED!参数周围的单引号起作用。自从它自动递增以来,也删除了id字段。现在看着mysqli。谢谢你们的帮助。

+0

所有的代码需要工作。 **不要**用'@'来压缩错误;这就像将胶带放在Check Engine Light上。 'mysql_'函数被弃用,使用'mysqli_'或'PDO'。了解准备好的陈述。 – Kermit

+0

你看过任何例子吗?另外,对于任何非注册日期的数据库API和绑定参数,这是一个问题。 – mario

+0

在'VALUES('',“$ first_name”,“$ last_name”,“$ email”)中将单引号改为' –

回答

0

您正在关闭报价。一个非常简单的例子:

"foo"$variable"bar" 

这简直是无效的PHP语法。你可以做的是:

VALUES ('', " . $first_name . " 

使用串联,.

您还可以使用插值:

VALUES ('', $first_name, 

但是,你真的不应该这样做,因为你的查询很容易受到注射。如果没有围绕值的撇号,它甚至可能不起作用。

您应该使用与PDO或mysqli的,而不是使用ext/mysql正确参数化查询。

0

你试图连接字符串,但你还没有告诉PHP这样做! Continentating是这样完成的:

$ new_string = $ string1。 $字符串2

    ˆ this indicates you are "summing" two strings 

所以,在你的代码,你应该做的东西像下面这样:

的mysql_query(“INSERT INTO用户(ID,第一个,最后,电子邮件)VALUES( '' ,'。。$ first_name。“','”。$ last_name。“','。。$ email。”')“);

重要:此代码包含几个漏洞!有人可以很容易地注入SQL代码并可以完全访问数据库!查看更多关于在将字符串追加到查询之前转义字符串的信息。您可以使用mysql_real_escape_stringhttp://www.php.net/function.mysql-real-escape-string

+0

不应该使用'mysql_real_escape_string'(正如链接的'PHP'手册中所述)。 – Rayne

+0

因为整个扩展在PHP 5.5中不推荐使用...但这不是这种情况,但我同意,PDO是处理SQL的更好方法。 –

0

使用var_dump(queries);

0

其他的一切表示,到目前为止是真的,你很容易受到SQL注入试试这个代码

<?php 

$first_name = $_POST ['firstname']; 
$last_name = $_POST ['lastname']; 
$email = $_POST ['email']; 

$db_host = "localhost"; 
$db_username = "root"; 
$db_pass = "password"; 
$db_name = "db_name"; 

//connect to database 
@mysql_connect ($db_host, $db_username, $db_pass) or die ("Unable to connect to  database at the moment. Please try again later.") ; 

//select the database to work with 
@mysql_select_db($db_name) or die("No such database"); 

mysql_query("INSERT INTO users (id, first, last, email) VALUES (null, '".$first_name"', '".$last_name."', '".$email."') "); 

?> 

仍然有错误调试错误做到这一点。但我还想补充一点,我认为你应该完全取出插入的ID部分。而这是为什么:http://www.w3schools.com/sql/sql_autoincrement.asp

所以insert语句看起来会像这样:

INSERT INTO Users (first,last,email) VALUES ($first_Name,$Last_Name,$Email) 

除此之外,我会跟随@Janak生主的例子,但千万记住,除非这是一所学校项目你应该做更多的工作以防止SQL注入。

+0

完成了,作品!谢谢 – user3037373

0

在查询中删除双引号,并添加单引号。因为当您指定varchar()类型的数据时,应该使用单引号,否则它可能会闪烁解析错误。这样可以正常工作。

mysql_query("INSERT INTO users (id, first, last, email) VALUES ('', '$first_name', '$last_name', '$email') ");