【问题标题】:Pass array of "WHERE" statements to php将“WHERE”语句数组传递给 php
【发布时间】:2015-01-14 02:45:07
【问题描述】:

我希望获取几个选择框的值并将它们全部连接到一个数组中以用于形成一个 mySQL 查询。该数组包含WHERE 语句的键和值。我正在制作这样的数组:

var allvars = [];
$('#more_rows').click(function(){
var onevar = $('#first_select option:selected').text();  
var twovar = $('#second_select option:selected').text();
allvars.push(onevar + "," + twovar );
});

这最终给了我一个这样的数组:

["age , 29", "gender, male"]

问题是...我如何将其输入 PHP 以返回计数?我正在处理这样的事情。

jQuery:

  $.ajax({
        url: 'att_count.php',
        type: 'GET',
        dataType: 'JSON',
        data: {all_att: allvars},
        success: function(data) {
       //code to display count
 }
 });

PHP(相关部分):

$whereAttributes = isset($_GET['all_att'])? "{$_GET['all_att']}" : '';

$whereAttributes = mysql_real_escape_string($whereAttributes);

$sql = "select count(guid) from full_db2 where {$whereAttributes};";

$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);

header('Content-type: application/json');
echo json_encode($result);

当然,这是行不通的,并给我这样的错误日志:

Call to a member function fetchAll() on a non-object in ../att_count.php on line 14(即上面 PHP 中以$sql 开头的那一行)。

我确信总体上有一些更好的方法可以做到这一点,但这是我第一次尝试。目标是能够将“无限”数量的键/值对传递到 PHP 中,以返回具有该键/值组合的所有记录的 COUNT。假设现在所有的连接都是“AND”......所以最终的查询应该是这样的,使用上面的数组:

SELECT COUNT(guid) FROM full_db2 WHERE age = '25' AND gender = 'male';

任何关于如何使用我当前的代码来解决这个问题的建议都会有所帮助,任何关于更清洁、更好的方式来组合这个查询的建议都将不胜感激。

【问题讨论】:

  • 无论你做什么,都不要在 Javascript 中构造你的WHERE 子句,并让 PHP 未经编辑地将它传递给 MySQL——这就是 SQL 注入的路径。使用 PHP 验证键/值对并根据结果在 PHP 中构建您的 WHERE 子句。
  • 我认为我正在按照您的建议进行操作。我只是将 URL 中的属性传递给 PHP,然后它就形成了 WHERE 子句。我还添加了mysql_real_escape_string。看看我上面的代码,如果我做得正确,请告诉我。
  • 您的代码从$_GET['all_att'] 中取出原始值并将其直接插入到 SQL 查询中。你需要检查你是否有你接受的键和有意义的值,然后从中组装一个查询。
  • @HoboSapiens 键和值直接来自数据库,因为我的选择是从数据库动态生成的。那么,假设是这种情况,我该如何构造一个合适的查询呢?

标签: php jquery mysql arrays json


【解决方案1】:

这是一个问题,我在取得更多进展后能够解决这个问题:

Create array for PDO from variables passed from jquery

以下是相关部分:

$q = $dbh->prepare("DESCRIBE full_db2");
 $q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
$validKeys = $table_fields;
$sql = 'SELECT COUNT(guid) FROM full_db2';
$any_condition = false;
foreach($_GET as $key=>$val) {
   if (!empty($val) && in_array($key,$validKeys)) {
     if ($any_condition) {
       $sql .= ' AND '.$key.' = :'.$key;
     } else {
       $sql .= ' WHERE '.$key.' = :'.$key;
       $any_condition = true;
     }
   }
}

$stmt = $dbh->prepare($sql);

foreach($_GET as $key=>$val) {

if (!empty($val)  && in_array($key,$validKeys)) {
 $stmt ->bindValue(':'.$key, $val, PDO::PARAM_STR);
 }
}

$stmt->execute();

【讨论】:

    【解决方案2】:

    在服务器端使用以下代码:

    // $whereAttributes = isset($_GET['all_att'])? "{$_GET['all_att']}" : ''; THIS LINE WAS WRONG
    
     $whereAttributes =$_GET['all_att'];
    
    $age_data=$whereAttributes[0];
    
    $gender_data=$whereAttributes [1];
    
    $age_data_array=explode(','$age_data);
    
    $gender_data_array=explode(',',$gender_data);
    
    $where_clause=trim($age_data_array[0])." = ".trim($age_data_array[0])." AND " .trim($gender_data_array[0])."=".trim($gender_data_array[1]);
    
    $sql = "select count(guid) from full_db2 where ". $where_clause;
    

    【讨论】:

    • 不要使用这个。 $_GET['all_att'] 包含一个字符串,而不是一个数组。此后的一切都因那个错误而失败。仍然没有进行任何清理,因此 SQL 注入仍有可能
    • @HoboSapiens, all_vars 是一个数组。查询 fecthes 值,不插入任何东西 - 那为什么要清理?
    • $_GET 数组中的任何单个值都是字符串。您的代码将其视为数组,因此它将失败。也可以传递一个键/值对,如'age,age',这将导致一个 where 子句,如where age=age(如果您的代码有效),这将导致所有行都被返回。在这里,这可能只是不方便,但在其他地方,类似的代码可能会允许登录,其中不应该是可能的,或者删除表中的所有行,或者我还没有想到的其他讨厌的东西。
    • @HoboSapiens, '$_GET 数组中的任何单个值都是一个字符串。' - 不同意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2012-08-25
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    相关资源
    最近更新 更多