【问题标题】:SQL - Getting the exact one that's heard of a comma separationSQL - 得到准确的逗号分隔
【发布时间】:2021-04-14 01:24:40
【问题描述】:

我想从我的数据库中获取准确的数据集。例如,我将在前端选择一个数字。这应该在数据库中查看它是否存在,然后给我确切的数据集,但我只用 LIKE 语句得到它,这给了我 2 个不正确的数据集。这些值用逗号分隔。

这是一个代码示例:

$results   = $wpdb->get_results( 'SELECT * 
                                  FROM ' . $wpdb->prefix . "imports 
                                  WHERE import_strassennamen = '" . $_POST['street'] . "' 
                                  AND import_anzahl_strassen LIKE '%," . $_POST['street_nr'] . ",%' 
                                  AND import_year = '" . $_POST['year'] . "'", OBJECT );

名字是德语,因为我来自德国。

现在以出现两次但具有不同的所谓“区域”的数据记录为例。

例如,您可以在前端的选择字段中选择一个街道号,然后应该可以找到该区域的街道号。

例如,如果您在前端选择 4,则将选择编号为 3 的区域。或者如果您选择数字 17,则选择区域 2。

【问题讨论】:

  • 我确信 WordPress 开发人员已尽一切努力保护他们的代码免受 SQL Injection Attack 的攻击。但你刚刚摧毁了这一切。您应该始终在 MYSQLI_PDO API 中使用 prepared parameterized statements,而不是将用户提供的值连接到查询中。
  • 那么在什么情况下您会获得比预期更多的记录?您使用的街道号输入值是什么,在这里也可以得到 area=2 的记录,尽管您只希望得到 area=3 的记录?
  • 哦,好老的逗号分隔信息数据库设计错误。
  • WHERE find_in_set(4, import_anzahl_strassen); 这对你有用吗
  • 是的,FIND_IN_SET 确实是最好的选择 - 这样您就不必自己为值添加任何逗号。

标签: php sql database wordpress


【解决方案1】:

经过与一些成员的长时间讨论,我已经为这个问题制定了自己的解决方案。这不是优雅的方式,但我最终做到了:

if ( $_POST['street_nr'] == '4' && $_POST['street'] == 'Hauptstraße' ) {
        $results = $wpdb->get_results( 'SELECT * FROM ' . $wpdb->prefix . "imports WHERE import_strassennamen = '" . $_POST['street'] . "' AND import_anzahl_strassen LIKE '4,%' AND import_year = '" . $_POST['year'] . "'", OBJECT );
    } elseif ( $_POST['street_nr'] == '6' && $_POST['street'] == 'Hauptstraße' || $_POST['street_nr'] == '7' && $_POST['street'] == 'Hauptstraße' || $_POST['street_nr'] == '8' && $_POST['street'] == 'Hauptstraße' || $_POST['street_nr'] == '9' && $_POST['street'] == 'Hauptstraße' ) {
        $results = $wpdb->get_results( 'SELECT * FROM ' . $wpdb->prefix . "imports WHERE import_strassennamen = '" . $_POST['street'] . "' AND import_anzahl_strassen LIKE '%," . $_POST['street_nr'] . ",%' AND import_year = '" . $_POST['year'] . "'", OBJECT );
    } else {
        $results = $wpdb->get_results( 'SELECT * FROM ' . $wpdb->prefix . "imports WHERE import_strassennamen = '" . $_POST['street'] . "' AND import_anzahl_strassen REGEXP '(," . $_POST['street_nr'] . ')|(' . $_POST['street_nr'] . ",)' and import_year = '" . $_POST['year'] . "'", OBJECT );
    }

我在 PHP 中做了一个区分来启动其他 SQL。我知道它根本不是最快和最安全的方式,但它确实有效。如果有人对这个问题有更好的解决方案,我强烈推荐它。比如 SQL 解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多