我正在尝试在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);
答案 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);