如何将 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 查询构建器 [重复]