如何将 JSON 转换为 SQL 查询 - php

Posted

技术标签:

【中文标题】如何将 JSON 转换为 SQL 查询 - php【英文标题】:How to convert JSON to SQLI query - php 【发布时间】:2015-09-18 05:18:25 【问题描述】:

我对编码很陌生,我已经遇到了需要将 JSON 转换为 SQLi 查询但我无法完成我需要的情况。

我正在尝试找到一种从 url 获取参数的方法,并基于它们使用通用函数从我的数据库中插入、更新、删除或选择。

JSON INSERT:
"Username":"MyEmail@email.com","Password":"329670c3265b6ccd392e622733e9772f"

JSON UPDATE:
"Username":"MyEmail@email.com","Password":"newpacd392worda12123sdw112asddww"

以上 JSON 是从检查 URL 查询字符串并将其转换为 JSON 的函数中检索的

 function php_raw_query() 
        $raw = filter_input(INPUT_SERVER, 'QUERY_STRING', FILTER_SANITIZE_STRING);
        $arr = array();
        $pairs = explode('&', $raw);
        foreach ($pairs as $i) 
            if (!empty($i)) 
                list($name, $value) = explode('=', $i, 2);
                if(isset($arr[$name]))
                    if (is_array($arr[$name]))
                        $arr[$name][] = $value;
                     
                    else 
                        $arr[$name] = array($arr[$name], $value);
                    
                 
                else 
                    $arr[$name] = $value;
                
            
               
        return $arr;
    
    $json = json_encode(php_raw_query());

完成此操作后,我需要根据传递的数据构建变量查询,例如,如果我有 USER 和 PASS,我可以登录、注册、请求更改或删除密码。

考虑到这一点,用户可以执行:

SELECT * FROM 'users' WHERE 'Username'='MyEmail@email.com' AND 'Password'='329670c3265b6ccd392e622733e9772f';

请注意,列名(用户名)和值(MyEmail@email.com)都分别取自 JSON 键、值,并且仅当 JSON 数组具有超过 1 个元素时才包含 AND 语句。

这可以实现吗?

【问题讨论】:

您如何知道何时插入和何时更新?您是通过 url 还是其他方式获得的? 我首先调用一个 AJAX,它使用 GET 方法指向上面的 PHP 文件,该文件将为其提供 SQL 查询以执行更新、插入等也可以在 url 中。所以 JSON 可以像 "Action":"UPDATE","Username":"MyEmail@email.com","Password":"329670c3265b6ccd392e622733e9772f" 我只需要知道如何阅读它并构建查询。 【参考方案1】:

首先,您使用 json_decode 解码您的 json 代码并将其存储在一个变量中,然后像在 sql 查询中一样使用它。

【讨论】:

【参考方案2】:

@Lukasz,我刚刚使用了你的一段代码并且工作正常。我已经对 raw_query 函数应用了最小的更改,但似乎工作正常。

此外,我不了解 SQL 注入。您介意再详细说明一下吗?

谢谢。

网址:_module.php?Username=MyEmail@email.com&Password=329670c3265b6ccd392e622733e9772f

`

ob_start();

function php_raw_query() 
    $raw = filter_input(INPUT_SERVER, 'QUERY_STRING', FILTER_SANITIZE_STRING);
    $arr = array();
    $pairs = explode('&', $raw);
    foreach ($pairs as $i) 
        if (!empty($i)) 
            list($name, $value) = explode('=', $i, 2);
            if (isset($arr[$name])) 
                if (is_array($arr[$name])) 
                    $arr[$name][] = $value;
                 else 
                    $arr[$name] = array($arr[$name], $value);
                
             else 
                $arr[$name] = $value;
            
        
    
    return json_encode($arr);


$object = json_decode(php_raw_query());

function generate($object) 
    $query = 'SELECT * FROM table WHERE ';
    $paramsArray = [];
    foreach ($object as $key => $value) 
        $paramsArray[] = "'$key' = '$value'";
    
    return $query . implode(' AND ', $paramsArray) . ";";


echo generate($object);

ob_end_flush(); 

`

AJAX:

`

$(document).on('submit', 'form', function (e)     
var information = $(this).serialize();

e.preventDefault();

$.ajax(
    url: "_module.php",
    data: information,
    type: "GET",
    dataType: "json",
    success: function (data) 
        $("#post-wrapper").html(data);            
    ,
    error: function () 
        console.log('Cannot retrieve data.');
    
);

); `

输出 div 显示:SELECT * FROM table WHERE 'username' = 'MyEmail%40email.com' AND 'password' = '329670c3265b6ccd392e622733e9772f';

【讨论】:

在我的代码中将第一行更改为 $object = json_decode('"Username":"hej\'; DELETE FROM table; SELECT * FROM table WHERE email=MyEmail@email.com ","密码":"329670c3265b6ccd392e622733e9772f"');【参考方案3】:

应该对你有帮助

$object = json_decode('"Username":"MyEmail@email.com","Password":"329670c3265b6ccd392e622733e9772f"');

function generate($object)     
    $query = 'SELECT * FROM table WHERE ';

    $paramsArray = [];
        foreach ($object as $key => $value) 
            $paramsArray[] = "'$key' = '$value'";
        

    return $query . implode(' AND ', $paramsArray) . ";";


echo generate($object);

但是以这种方式准备查询是不安全的。看https://pl.wikipedia.org/wiki/SQL_injection

【讨论】:

以上是关于如何将 JSON 转换为 SQL 查询 - php的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 php 数组将 sql 查询结果转换为数据透视表?

将 PHP SQL 转换为 Laravel 查询构建器 [重复]

如何在 PHP 中将字符串转换为 JSON 对象

将 SQL 查询转换为 Drupal 7 PHP 规则

PHP/jQuery - 如何将多维 PHP 数组转换为 JSON 字符串?

PHP 将 SQL 请求转换为 JSON