会话变量在MySQL语句中不起作用

时间:2012-01-31 22:26:45

标签: php mysql

我正在尝试在SQL语句中使用会话变量($_SESSION['asc_id'],其中包含一些值,如“AS0027001”),但它无效。 当我对该值进行硬编码时,它 提供结果。

任何人都可以纠正我。

无效的MySQL查询

$asc_id = $_SESSION['asc_id'];

$rs = mysql_query('select asc_lastname, asc_firstname, asc_middlename, lname_fname_dob
                     from issio_asc_workers where asc_user_type = 31
                      and asc_id  = "$asc_id"
                      and lname_fname_dob like "' .
                      mysql_real_escape_string($_REQUEST['term']) .
                      '%"  order by lname_fname_dob asc limit 0,10', $dblink);

正在运行的Mysql查询

$rs = mysql_query('select asc_lastname, asc_firstname, asc_middlename, lname_fname_dob 
                     from issio_asc_workers where asc_user_type = 31
                      and asc_id  = "AS0027001" and lname_fname_dob like "' .
                      mysql_real_escape_string($_REQUEST['term']) .
                      '%"  order by lname_fname_dob asc limit 0,10', $dblink);

4 个答案:

答案 0 :(得分:3)

变量替换仅适用于双引号字符串,而不是单引号字符串。换句话说,你应该这样做;

$rs = mysql_query("select .... and asc_id  = '$asc_id' and ... limit 0,10", $dblink);

顺便说一下,你确实确保该值不包含任何可能导致SQL注入的字符,对吧?否则,在将其插入查询之前,应该使用mysql_real_escape_string来确保。

答案 1 :(得分:1)

当你打印字符串时,它会很清楚。当重新格式化问题以使SQL可读时,问题很明显。 (调试SQL语句的第一条规则是“打印字符串”。第二条规则,它更容易遵守第一条规则,总是将SQL语句放入一个传递给SQL函数的字符串中。)

您使用.表示法将请求term嵌入字符串中;你不要用它来将$asc_id嵌入到字符串中。您还应该在会话ID值上使用mysql_real_escape_string()以防止SQL注入。

答案 2 :(得分:1)

首先打印变量$ asc_id。如果没有显示任何内容,则会话不可用。在这种情况下,您错过了当前执行页面顶部的session_start()。

从SQL查询中,您无法替换单引号字符串中的变量值。 使用 。用于将字符串值与变量混合或使用双引号字符串的符号。我更喜欢第一个。

对于故障排除,最简单的方法是打印变量值。从结果中,您将了解缺少的内容。

由于

答案 3 :(得分:1)

试试这个。从您添加的评论中,我像这样修改了

session_start(); //add this if you did not do it yet

$asc_id = $_SESSION['asc_id'];

$rs = mysql_query("select asc_lastname, asc_firstname, asc_middlename, lname_fname_dob
                 from issio_asc_workers where asc_user_type = 31
                  and asc_id  = '$asc_id'
                  and lname_fname_dob like '".
                  mysql_real_escape_string($_REQUEST['term']) .
                  "%'  order by lname_fname_dob asc limit 0,10", $dblink);