是我的选择陈述权利

时间:2011-11-20 06:08:08

标签: php mysql select

这句话在句法上是否正确:

$query = "SELECT matric_no session course_name
              FROM main_table session
              WHERE main_table.matric_no = '$_POST[matric_no]'
                  AND session.session_name = '$_SESSION[session]'
                  AND session.course_name =  '$_SESSION[course_name]'";
$result = mysql_query($query) ;                       
$duplicates = mysql_num_rows($result);

if ($duplicates = 1) {
    echo "you have dis in the database";
};

5 个答案:

答案 0 :(得分:2)

您不需要 SELECT 中的所有信息来检查会话是否在数据库中。

   $matricNo = $_POST[matric_no];
    $sessionName = $_ SESSION[session];
    $courseName = $_ SESSION[course_name];

//here you should use mysql_real_escape_string() for security
//like this $matricNo = mysql_real_escape_string($matricNo);

$query = "SELECT m.matric_no
          FROM main_table as m, session as s
          WHERE m.matric_no = '$matricNo' 
            AND s.session_name = '$sessionName'
            AND s.course_name = '$courseName'"; 

$result = mysql_query($query) or die (mysql_error()); 

$duplicates = mysql_num_rows($result); 

if ($duplicates > 0) { 
    echo "you have dis in the database"; 
};

答案 1 :(得分:2)

有三个问题:
1)在select语句中缺少逗号(已经指出) 2)解决了第一个问题后,它应生成笛卡尔积,因为您没有在两个表之间连接。你应该有这样的东西:

SELECT
  m.matric_no,
  s.course_name
FROM
  main_table mt,
  session s
WHERE
      mt.[SOMECOLUMN] = s.[ANOTHERCOLUMN]
  AND mt.matric_no    = '$_POST[matric_no]'
  AND s.session_name  = '$_SESSION[session]'
  AND s.course_name   = '$_SESSION[course_name]'"

或(如果支持ANSI样式的连接):

SELECT
  m.matric_no,
  s.course_name
FROM
  main_table mt
  JOIN
    session s ON (mt.[SOMECOLUMN] = s.[ANOTHERCOLUMN])
WHERE
      mt.matric_no   = '$_POST[matric_no]'
  AND s.session_name = '$_SESSION[session]'
  AND s.course_name  = '$_SESSION[course_name]'"

3)查询对SQL注入攻击开放。绝不传递变量而不先清理变量(至少可以由用户更改的变量)。如果可能的话,使用查询参数来处理问题。如果这不是一个选项,只需通过删除可用于更改查询的单引号等字符来清理变量。自从我使用MySQL以来已经有一段时间了,所以也许有一些我不知道的魔法可以为你解决这个问题,但我不知道这是怎么回事。更新:hafichuk建议做什么: - )

答案 2 :(得分:0)

不应该是:

$query = "SELECT main_table.matric_no, session.course_name

希望有所帮助

答案 3 :(得分:0)

您的查询中存在一些语法问题

如果main_table和session是两个不同的表,那么它应该是这样的。

"SELECT main_table.matric_no, session.course_name
          FROM main_table, session
          WHERE main_table.matric_no = '$_POST[matric_no]'
              AND session.session_name = '$_SESSION[session]'
              AND session.course_name =  '$_SESSION[course_name]'"

答案 4 :(得分:0)

您需要认真重新考虑的一件事是使用来自$_POST$_SESSION的未经过抽样的数据。这可能会对您的网站造成重大安全风险,因为有人可以轻松地执行某些SQL Injection

至少应该使用mysql_real_escape_string()

我还会考虑迁移你的代码以使用mysqli或PDO,因为mysql已经过时了。