使用 PHP 我试图拆分一个字符串来构建一个 SQL 搜索的 where 子句

Posted

技术标签:

【中文标题】使用 PHP 我试图拆分一个字符串来构建一个 SQL 搜索的 where 子句【英文标题】:Using PHP I am trying to split out a string to build a where clause for a SQL search 【发布时间】:2022-01-16 20:49:31 【问题描述】:

我现在正在使用 AdventureWorks 数据库进行练习,我将收到如下字符串:SalesOrderNumber=SOH123 和 CustomerID=1。字符串可能并不总是包含“=”,因为它们可能是 >、=、。

理想情况下,我想将每个字符串拆分为 3 个字段 - 要查询的数据库列、比较(例如 =、>、!= 等)和要搜索的值。

我可以通过大量代码实现我想要的,逐个字符比较,但我希望有人能提出一个非常简单的方法来做到这一点,因为我确信这对于网站来说一定是一个相当普遍的任务。

我不想只在字符串通过时使用它们,因为我需要先对它们进行消毒。我也不想向数据库发送可能会产生 SQL 错误的错误查询。

【问题讨论】:

也许你可以通过"ColumnName":" SalesOrderNumber","Op":"=","Value":"SOH123"等的JSON数组 这将是一种简单的方法,但它需要更改其他人正在管理的前端。我正在管理后端流程。如果我同时开发前端和后端,那么这将是我的首选。 【参考方案1】:

这是我使用 foreachexplodearray 函数的方法:

$strings = [
    'SalesOrderNumber=SOH123',
    'CustomerID=1',
    'BigOrEqual>=44',
    'SmallOrEqual<=67',
    'NotEqual!=123',
    'NotEqual<>2000',
    'Smaller<21',
    'Bigger>12',
];
function explodeOperators(array $strings) : array

    $operators = ['>=','<=','!=','<>','<','>','=']; // do not change this order
    $result = [];
    foreach ($strings as $expression) 
        $found = false;
        foreach ($operators as $operator) 
            $exploded = explode($operator, $expression);
            if (count($exploded) > 1 and $found === false) 
                $found = true;
                array_splice($exploded, 1, 0, $operator);
                $result[] = $exploded;
            
        
    
    return $result;

$result = explodeOperators($strings);
print_r($result);

结果如下:

Array
(
    [0] => Array
        (
            [0] => SalesOrderNumber
            [1] => =
            [2] => SOH123
        )

    [1] => Array
        (
            [0] => CustomerID
            [1] => =
            [2] => 1
        )

    [2] => Array
        (
            [0] => BigOrEqual
            [1] => >=
            [2] => 44
        )

    [3] => Array
        (
            [0] => SmallOrEqual
            [1] => <=
            [2] => 67
        )

    [4] => Array
        (
            [0] => NotEqual
            [1] => !=
            [2] => 123
        )

    [5] => Array
        (
            [0] => NotEqual
            [1] => <>
            [2] => 2000
        )

    [6] => Array
        (
            [0] => Smaller
            [1] => <
            [2] => 21
        )

    [7] => Array
        (
            [0] => Bigger
            [1] => >
            [2] => 12
        )

)

【讨论】:

谢谢,您说得对,第一个解决方案并非在所有情况下都有效。但是,您的解决方案确实有效。

以上是关于使用 PHP 我试图拆分一个字符串来构建一个 SQL 搜索的 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

PHP字符串拆分

PHP:将字符串拆分为数组 foreach char

如何在PHP中按字符将数组拆分为关联数组[重复]

如何从我拆分的单个字符串创建一个对象?

从 imageJ 拆分图像名称后,我试图选择字符串的最后一个索引。我知道在 python 中我们可以做 string[-1]

数组大小和字符串拆分