繁体   English   中英

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

[英]SQL syntax: passing variable to SQL query

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

<?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'”附近使用的正确语法

PS 我知道有 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 更新表并且不显示错误消息。 重新SQL注入漏洞,看我原来的PS语句

$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));

在这一行:

$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类似于以下内容:

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

要记住的一件事是,当您像在我的示例中一样执行 SQL 语句连接 ("SELECT" . $activity . ") 时,您会打开自己的SQL 注入攻击。

乍一看,我认为“可能”activity_level 数据类型不是字符串,而是数字。 所以你不需要在 WHERE activity_level = '$activity_level' 中放置 '...'

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

将 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)."'"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM