【问题标题】:Convert NoSQL like syntax to MySQL syntax将类似 NoSQL 的语法转换为 MySQL 语法
【发布时间】:2021-12-21 22:44:03
【问题描述】:

这是mysql表结构

item_id StockNo SizeCd
1 12003 UNIT
2 12007 JOGO
3 12008 PACOTE
4 12033 JOGO
5 12034 JOGO
6 12038 UNIT

我正在为远程数据网格使用名为DevExtreme 的插件。它的 API 请求如下所示。

{
  from: get_data
  skip: 0
  take: 50
  requireTotalCount: true
  filter: [["SizeCd","=","UNIT"],"or",["SizeCd","=","JOGO"]]
}

过滤器是我需要帮助的地方。我想要的是我想将此字符串转换为 MySQL where 条件语法。

我尝试使用像 array_merge join 这样的 php 函数,但无法让它工作。有时它会在两边加上引号,或者有时引号会丢失。它应该像不带引号的字段名和带引号的值。就像在 mysql where 语法中一样。

抱歉,格式和语法错误。

【问题讨论】:

  • 你能展示实际的代码和结构吗?
  • 如果字符串中有引号字符会发生什么,例如["SizeCd","=","JO'GO"]?
  • @SalmanA 也许我会使用 addlashes 来逃避它,或者考虑不会出现这种情况。
  • @Justinas 我已经编辑了我的问题。希望你现在能明白了。

标签: php mysql sql


【解决方案1】:

对于这个数组:

$array = [["SizeCd","=","UNIT"],"or",["SizeCd","=","JOGO"],"or",["SizeCd","=","PACOTE"]];

对于 PDO

您可以使用以下功能:

function arrayToQuery(string $tableName, array $array) : string 
{
    $select = "SELECT * FROM `{$tableName}` WHERE ";

    foreach($array as $item) {
        if(is_array($item)) {
            $select .= "`{$item[0]}` {$item[1]} ?";
        } else {
            $select .= " {$item} ";
        }
    }

    return $select;
}

function arrayToParams(array $array) : array  
{
    $return = [];
    foreach($array as $item) {
        if(is_array($item)) {
            $return[] = $item[2];
        }
    }
    return $return;
}

var_dump(
    arrayToQuery("x", $array),
    arrayToParams($array)
);

输出:

string(66) "SELECT * FROM `x` WHERE `SizeCd` = ? or `SizeCd` = ? or `SizeCd` = ?"
array(3) {
  [0]=>
  string(4) "UNIT"
  [1]=>
  string(4) "JOGO"
  [2]=>
  string(6) "PACOTE"
}

使用 PDO 的示例

$conn = /* your conn object */;
$sql = arrayToQuery("your_table_name", $array);
$stmt = $conn->prepare($sql);
$stmt->execute(arrayToParams($array));

更新:Mysqli

对于mysqli,你可以使用以下函数:

function arrayToQueryMysqli($mysqli, string $table, array $array) : string 
{
    $select = "SELECT * FROM `{$table}` WHERE ";
    foreach($array as $item) {
        if(is_array($item)) {
            $select .= "`{$item[0]}` {$item[1]} '" . $mysqli->real_escape_string($item[2]) . "'";
        } else {
            $select .= " {$item} ";
        }
    }
    return $select;
}

$mysqli = new mysqli(/* Your settings */);
$query = arrayToQueryMysqli($mysqli, "tablename", $array);
$result = $mysqli->query($query);
var_dump($result);

【讨论】:

  • 感谢人做得很好。我不得不做一些小的改动,但看起来它正在工作。不过,有一个请求,如果您认为它有效,您可以投票赞成吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多