基本上,我从一个表单中提取四个变量的值,然后将这些值用作从数据库中的表中进行选择的WHERE语句。我在这里只提供了我的代码片段,因为我已经验证了从表单到有问题的变量的正确值,并且当我只检查groupid和memberid时,代码工作得很好,并越过if语句进入我的else语句。
groupid是一个4位数字。memberid是一个3位数字。name是像John a.Smith那样的全名dob是一个类似1900-10-31 的日期
下面是我试图运行的查询。在我得到MySQL错误后,它确实显示消息"成员不存在"。我在这里缺少什么?
$qry="SELECT * FROM members WHERE groupid = $groupid AND memberid = $memberid AND membername = $name AND memberdob = $dob";
$result=mysql_query($qry);
if(mysql_num_rows($result) == 0)
{
echo "Member does not exist";
}
else {....
$qry="SELECT * FROM members
WHERE groupid = $groupid
AND memberid = $memberid
AND membername = '$name'
AND memberdob = '$dob'";
在membername
和memberdob
周围加引号
groupid是一个4位数字。memberid是一个3位数字。name是像John a.Smith那样的全名,dob是像1900-10-31 那样的日期
这就是你的想法。黄金法则:永远不要相信用户的任何输入。
如果您想坚持使用mysql扩展,那么首先使用mysql_real_escape_string
对输入进行消毒。其次,引用传递给查询的变量。所以,不是
$qry = "... WHERE groupid = $groupid ...";
进行
$qry = "... WHERE groupid = '" . mysql_real_escape_string($groupid) . "'...";
在您的情况下,查询失败的最可能原因是$name
变量。它包含空格。空格是查询中断的位置。引用变量将解决问题:
$qry = "SELECT *
FROM members
WHERE groupid = '" . mysql_real_escape_string($groupid) . "'
AND memberid = '" . mysql_real_escape_string($memberid) . "'
AND membername = '" . mysql_real_escape_string($name) . "'
AND memberdob = '" . mysql_real_escape_string($dob) . "'";
此外,还可以通过错误处理改进查询执行。简单示例:
$result = mysql_query($qry) or die('Invalid query: ' . mysql_error());
这将返回详细的错误描述,帮助您确定根本原因。
至于不推荐的mysql扩展的推荐替代方案:请阅读PHP手册中关于选择API的内容。
由于不知道应用程序的整个上下文,我认为从表单中检索变量后会正确处理变量。
mysql通常会抱怨字符串字段没有正确地用引号括起来。可能是从表单中正确检索了$name和$memberdob,但没有根据需要传递到查询中。尝试将查询更改为以下内容:
$qry="SELECT * FROM members WHERE
groupid = $groupid AND memberid = $memberid AND
membername = '$name' AND memberdob = '$dob'";