SQL语法:将变量传递给SQL查询

时间:2010-12-07 00:43:58

标签: php sql mysql variables mysql-error-1064

这是我的第一个程序,我已经做了大量的研究,试图回答这个问题,我无法解决问题:

<?php

    include "connect.php";

    if (!$connection)
      {
      die('Could not connect: ' . mysql_error());
      }

    $submit = $_POST["submit"];

    if ($submit=="Submit") {
      $date = $_POST["date"];
      $name = $_POST["name"];
      $activity = $_POST["activity"];
      $activity_level = $_POST["activity_level"];

    $find_role = ("SELECT sales_role 
                     FROM role 
                LEFT JOIN USER on user.role_id = role.id 
                    WHERE user.user = '$name'");
    $find_activity_points = ("SELECT $activity_$role 
                                FROM $activity 
                               WHERE activity_level = '$activity_level'"); 

    $role = mysql_query($find_role);

    $activity_points = mysql_query($find_activity_points);
     if ($activity_points !== false) {
     }
      else {
       echo mysql_error ();
       die;
     }

     $convert_activity_points = array();

    while ($row = mysql_fetch_array($activity_points, MYSQL_ASSOC)) {
      $convert_activity_points[] = $row;
     }



    $set_points = "UPDATE $name SET $activity='$convert_activity_points' WHERE day='$date'";
     mysql_query($set_points);


    } 

    mysql_close($connection);

    ?>

这是我将form.php提交到update.php时收到的错误消息: 您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以便在第1行“FROM dial WHERE activity_level = '70”附近使用正确的语法

P.S。我知道有SQL注入漏洞,但我是唯一使用此程序的人,我在我的计算机上本地使用它。我现在对这些漏洞感到满意。

编辑:更改了代码(我非常感谢您的反馈)

$find_role = "SELECT sales_role FROM role LEFT JOIN USER on user.role_id=role.id WHERE user.user='$name'";

$find_activity_points = "SELECT %s_%s FROM $activity WHERE activity_level='%d'";    

list($role) = mysql_fetch_array(mysql_query($find_role));

 $activity_points = mysql_query(
     sprintf($find_activity_points, //the main string
         $activity, $role, $activity, $activity_level) //the "arguments"
  );    

    if ($activity_points !== false) {
    }
        else {
            echo mysql_error ();
            die;
    }

使用0更新表,并且不显示错误消息。 Re SQL注入漏洞,请参阅我原来的PS声明

4 个答案:

答案 0 :(得分:1)

在这一行:

$find_activity_points = ("SELECT $activity_$role FROM $activity WHERE activity_level='$activity_level'"); 

我无法在代码中看到您在执行查询之前定义$role的值。

因此,假设$activity == 'Eating'您的SELECT语句可能如下所示:

SELECT Eating_$role FROM Eating WHERE activity_level='...'

这可能会导致您的错误,因为我认为MySQL不允许表/列名称中包含$个字符。

正如Babiker所建议的那样,连接或使用sprintf()可以帮助解决其中的一些问题。


编辑:在评论中回答您的问题。

正如其他人提到的那样,将您的$find_activity_points行更改为类似于以下内容的内容:

$find_activity_points = ("SELECT " . $activity . "_" . $role . " FROM " . $activity . " WHERE activity_level='" . $activity_level . "'");

要记住的一件事是,当您执行SQL语句连接(“SELECT”。$ activity。“)时,就像在我的示例中一样,您可以打开SQL Injection次攻击。

答案 1 :(得分:0)

$ role直到程序的后期才定义,即使这样,它也是一个非标量值,也会破坏你的查询。您在尝试使用变量之前尝试使用这些变量。它们不会那样工作,一旦设置了该字符串,它将包含这些变量在声明时的值。

您可能想要使用sprintf。 http://php.net/manual/en/function.sprintf.php

  $find_activity_points = "SELECT %s_%s FROM %s WHERE activity_level='%d'"; 

然后

  $activity_points = mysql_query(
     sprintf($find_activity_points, //the main string
         $activity, $role, $activity, $activity_level) //the "arguments"
  );

当然,您仍需要使$role成为可在字符串中正确处理的(标量)值。一种(有点不安全但很快)的方法是:

  list($role) = mysql_fetch_array(mysql_query($find_role));

答案 2 :(得分:0)

乍一看,我认为“也许”activity_level数据类型不是字符串,而是数字。所以你不需要在WHERE activity_level ='$ activity_level'

中放置'...'

编辑:为确保导致问题的原因,我建议记录,例如here。只需包含该类并将您的查询记录在一个文件中(非常简单),然后检查查询本身。

答案 3 :(得分:-1)

将php字符串连接到mysql字符串,例如:

mysql_query("SELECT * FROM `someTable` WHERE `someValue`='".$someVar'");
  • $_POST["activity_level"]是一个包含'的字符串。

解决方案:

"SELECT `".$activity_$role."` FROM `".$activity."` WHERE `activity_level`='".mysql_real_escape_string($activity_level)."'"