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

Php SQL语法:将变量传递给SQL查询,php,sql,mysql,variables,mysql-error-1064,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["

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

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

    ?>
使用0更新表,并且不显示错误消息。
关于SQL注入漏洞,请参阅我的原始PS语句

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

mysql_query("SELECT * FROM `someTable` WHERE `someValue`='".$someVar'");
  • $\u POST[“活动级别”]
    是一个包含
    '
    的字符串
解决方案:

"SELECT `".$activity_$role."` FROM `".$activity."` WHERE `activity_level`='".mysql_real_escape_string($activity_level)."'"
在这一行:

$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不允许在表/列名中使用
$
字符

如前所述,连接或使用sprintf()可以帮助解决其中一些问题


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

如其他人所述,将您的
$find\u activity\u points
行更改为类似以下内容:

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

要记住的一件事是,当您执行SQL语句连接时(“选择“$activity”)就像在我的示例中,您打开了自己的攻击。

$role直到稍后在您的程序中才定义,即使这样,它也是一个非标量值,也会破坏您的查询。您试图在变量有值之前使用这些变量。它们不起作用,一旦设置了该字符串,它将包含这些变量当时的值它被宣布了

您可能想使用sprintf。

然后

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

乍一看,我认为“可能”活动级别的数据类型不是字符串,而是数字。因此,您不需要将“…”放在活动级别=“$activity\u level”的位置


编辑:为了确定问题的原因,我建议使用日志记录,如示例所示。只需包含类并将查询记录在文件中(非常简单),然后检查查询本身。

您是否查看了什么sql查询是通过
echo
传递给mysql的?还有,为什么要在字符串周围添加括号,如
(“foo bar”)
?是否
活动级别
是数字类型?是否可能是
70
周围的引号?可能的输入错误:“$activity\u$role”我现在对漏洞没有意见。”:-(!!“我现在对漏洞没有意见。"这就是为什么黑客们在入侵了这些程序员的系统后感觉自己像神一样。根据她收到的错误消息,她的查询似乎被正确地连接/替换了。也许错误甚至是在
角色
前面加了一个
$
。在代码的其他地方,她引用了一个
销售人员角色
字段,因此,也许它应该是
$activity.“\u role”
(例如,
吃\u role
)。列名格式是activity_role,因此拨号表将是dial_sdr、dial_ae、dial_outbound等,而Conva表将是Conva_sdr、Conva_ae、Conva_outbound等。我知道这似乎是一种愚蠢的数据库设置方式,但由于比赛的设置方式,我不确定使用什么其他结构。不同的观点是不同的基于同一活动的角色进行ARD。例如:SDR:7个CONVAS:1 pt 8-10 CONVAS:2 pt 11-14 CONVAS:5 pt 15+CONVAS:8 ptAE:5 CONVAS:1 pt,6-7 CONVAS:2 pt,8-9 CONVAS:5 pt,10+CONVAS:8 pt。因此,列格式为活动角色$find_role=“从用户上的角色左侧加入用户中选择销售角色。角色\u id=role.id WHERE USER.USER='$name';$find\u activity\u points=“从$activity中选择%s\u%s WHERE activity\u level='%d'”;列表($role)=mysql\u获取数组(mysql\u查询($find\u角色));$activity\u points=mysql\u查询(sprintf($find_activity_points,//主字符串$activity,$role,$activity,$activity_level)//参数);如果($activity_points!==false){}否则{echo mysql_error();die;}请原谅,$find_activity_points字符串中的$activity应该是“%s”"同样。这在我的回答中已经解决,尝试在当前代码中更改它,它应该可以工作。从form.php活动级别:



我的意思是,在数据库中,活动级别可能是数字类型。这与表单无关。无论如何,我强烈建议您在执行查询之前记录它。这样更容易获得回答正确。
  $activity_points = mysql_query(
     sprintf($find_activity_points, //the main string
         $activity, $role, $activity, $activity_level) //the "arguments"
  );
  list($role) = mysql_fetch_array(mysql_query($find_role));