【问题标题】:php parse error passing variable from form to database [closed]php解析错误将变量从表单传递到数据库[关闭]
【发布时间】:2013-12-17 17:09:22
【问题描述】:

所以我使用 HTML 表单将信息发布到 php,然后使用 php 脚本将其发送到数据库。但是我不断收到 $first_name 的意外变量 (t_variable) 的解析错误。这是我的代码

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

 ?>

phpmyadmin 中的字段类型 id 是 INT(25 长度) - 自动递增,因此无需提供它。 其他都是 varchar(255 长度)

注意:我已经对这些值进行了硬编码并且它有效,只是在我尝试传递变量时不起作用。我也尝试过不带引号的变量,但它不起作用。

我该如何解决这个问题?

谢谢

已修复!!!参数周围的单引号起作用。还删除了 id 字段,因为它是自动递增的。现在也在看mysqli。谢谢你们的帮助。

【问题讨论】:

  • 您的所有代码都需要工作。 不要使用@抑制错误;这就像在您的 Check Engine Light 上贴上胶带。 mysql_ 函数已弃用,请使用 mysqli_PDO。了解准备好的语句。
  • 你看过任何例子吗?此外,使用任何未过时的数据库 API 和绑定参数都不会有这个问题。
  • VALUES ('', "$first_name", "$last_name", "$email")中的双引号改为单引号
  • "$db_name" 很好,但为了安全起见,您应该这样做:(string)strval("$db_name")
  • 谢谢大家,是的,我也在研究 mysqli,但我的教授希望我们使用 mysql,然后再次在 mysqli 中使用(不知道为什么)。单引号起到了作用!谢谢

标签: php mysql database forms


【解决方案1】:

试试这个代码

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

 ?>

使用var_dump(queries);仍然有错误调试错误

【讨论】:

    【解决方案2】:

    您正在关闭引号。一个很简单的例子:

    "foo"$variable"bar"
    

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

    VALUES ('', " . $first_name . "
    

    使用串联,.

    你也可以使用插值:

    VALUES ('', $first_name, 
    

    但是,您真的不应该这样做,因为您的查询容易受到注入的影响。如果没有围绕值的撇号,它甚至可能无法工作。

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

    【讨论】:

      【解决方案3】:

      您正在尝试连接字符串,但您没有告诉 PHP 这样做! Contatenating 是这样完成的:

      $new_string = $string1 。 $string2

                         ˆ this indicates you are "summing" two strings
      

      因此,在您的代码中,您应该执行以下操作:

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

      重要提示:此代码包含多个漏洞!有人可以轻松注入 SQL 代码并完全访问您的数据库!在将字符串附加到查询之前,请参阅有关转义字符串的更多信息。你可以使用mysql_real_escape_string (http://www.php.net/function.mysql-real-escape-string)

      【讨论】:

      • 不应使用mysql_real_escape_string(如链接的PHP手册中所述)。
      • 因为整个扩展在 PHP 5.5 中已被弃用...但这里的情况并非如此,但我同意,PDO 是一种更好的 SQL 处理方式。
      【解决方案4】:

      到目前为止所说的一切都是正确的,您很容易受到 SQL 注入的攻击。但我还要补充一点,我认为您应该完全取出插入的 ID 部分。原因如下:http://www.w3schools.com/sql/sql_autoincrement.asp

      所以插入语句看起来更像这样:

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

      除此之外,我会遵循 @Janak Prajapati 的示例,但请记住,除非这是一个学校项目,否则您应该采取更多措施来防止 SQL 注入。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-12
          • 2011-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-16
          • 1970-01-01
          相关资源
          最近更新 更多