【问题标题】:How to escape things within zend literal?如何逃避 zend 文字中的东西?
【发布时间】:2017-07-01 19:20:21
【问题描述】:

我正在创建一个高级搜索,并希望通过将查询添加到这样的数组来循环查询:

private $searchFields = [
    'as_first_name'                  => 'users.first_name like "%VALUE%"',
    'as_last_name'                   => 'users.last_name like "%VALUE%"',
    'as_payment_history_invoice_num' => 'users.user_id = (SELECT user_id from payment_history where payment_history.invoice_number = "VALUE" LIMIT 1)',
    'as_building_num'                => 'property_units.building_number like "%VALUE%"',
    'as_residents_email'             => 'users.email like "%VALUE%"',
    'as_property_name'               => 'property.name like "%VALUE%"',
    'as_phone_num'                   => 'REPLACE(REPLACE(REPLACE(REPLACE(users.phone, " ", ""), "(", ""), ")", ""), "-", "") = "VALUE"',
    'as_unit_num'                    => 'property_units.unit_number = "VALUE"',
    'as_account_status'              => 'user_status.status_name = "VALUE"'
];

所以在搜索我正在做类似的事情..

if (array_key_exists($key, $this->searchFields)) {

    $form->get($key)->setValue($val);
    $where->NEST->literal(str_replace('VALUE', urldecode($val), $this->searchFields[$key]))->UNNEST;
}

但问题是我没有逃避那里的任何东西。不好。我怎样才能使用相同的结构,但也可以转义。

【问题讨论】:

    标签: php mysql search zend-framework zend-framework2


    【解决方案1】:

    Literal 谓词适用于没有占位符的情况。 您应该改用 Expression 谓词。

    private $searchFields = [
        'as_first_name'                  => 'users.first_name like "?"',
        'as_last_name'                   => 'users.last_name like "?"',
        'as_payment_history_invoice_num' => 'users.user_id = (SELECT user_id from payment_history where payment_history.invoice_number = "?" LIMIT 1)',
        'as_building_num'                => 'property_units.building_number like "?"',
        'as_residents_email'             => 'users.email like "?"',
        'as_property_name'               => 'property.name like "?"',
        'as_phone_num'                   => 'REPLACE(REPLACE(REPLACE(REPLACE(users.phone, " ", ""), "(", ""), ")", ""), "-", "") = "?"',
        'as_unit_num'                    => 'property_units.unit_number = "?"',
        'as_account_status'              => 'user_status.status_name = "?"'
    ];
    

    zend-form 值应该已经被解码,所以不需要 urldecode

    if (array_key_exists($key, $this->searchFields)) {
    
        $form->get($key)->setValue($val);
        $where->NEST->expression($this->searchFields[$key], $val)->UNNEST;
    }
    

    我有一段时间没有使用 zend-db,请务必检查此代码是否确实生成了您需要的查询。

    【讨论】:

    • 我认为那更接近..但我得到了。 SQLSTATE [HY093]:无效的参数编号:绑定变量的数量与标记的数量不匹配我为每个语句绑定一个参数,所以不知道为什么会这样。
    • 你必须去掉 ?...
    • @hamobi 我不记得被引用的占位符,这很有意义。此外,作为旁注,占位符可以有两种形式:位置 (?) 和命名 (:placeholder_name)。如果使用命名占位符,则需要为值(第二个参数)提供关联数组,其中键匹配占位符名称,命名占位符可能会出现多次
    【解决方案2】:

    你不应该使用urldecode;在你到这里之前它应该已经被解码了。听起来NEST 对于这种情况可能太花哨了。

    foreach (...)
    {
        $val = ...;  // Get the raw value from the form field ($_POST[...] or whatever)
        $mval = addslashes($val);
        $sf = $this->searchFields[...];
        $msf = str_replace('VALUE', $mval, $sf);
        ... $msf ...
    }
    

    mysqli_real_escape_str会比addslashes好,但是你需要有mysql连接对象;你有吗?

    【讨论】:

    • 不,我无权访问数据库连接.. 需要以 zendy 的方式进行此操作
    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 2011-09-22
    • 2013-02-09
    • 2020-02-14
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多