【问题标题】:Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given警告:mysqli_real_escape_string() 期望参数 2 是字符串,给定数组
【发布时间】:2018-06-08 14:35:22
【问题描述】:

我从表单中收到一些变量:

$start = $_POST['startDate'];
$start = explode(",", $start);
$end = $_POST['endDate'];
$end = explode(",", $end);

如果我检查数组:

echo '<pre>' . var_export($start, true) . '</pre>';
echo '<pre>' . var_export($end, true) . '</pre>';

我明白了:

array (
  0 => '1984',
)
array (
  0 => '2017',
)

如果我这样做:

<h2><?php echo $start; ?>, <?php echo $end; ?></h2>

我得到空白结果。

但我这样做没关系:

<h2><?php foreach($start as $st) { echo $st; } ?>, <?php foreach($end as $en) { echo $en; } ?></h2>

但是,之后我正在运行一个查询:

query_posts(
    array(
        'post_type' => 'post',
        'order'          => 'ASC',
        'posts_per_page' => -1,
        'cache_results' => false,
        'no_found_rows' => true,
        'update_post_meta_cache' => false, 
        'update_post_term_cache' => false, 
        'meta_query' => array(
            array(
                'key'     => 'usp-custom-14',
                'value'   => array($start, $end),
                'compare' => 'IN',
                'type'    => 'NUMERIC'

            )
        )
    )
);

结果是警告:

警告:mysqli_real_escape_string() 期望参数 2 是字符串, 给定数组...

以及所有文章的完整列表。

我只需要在custom field 中找到我从form variable 获得的值的文章

我尝试将'type' =&gt; 'NUMERIC' 更改为'type' =&gt; 'CHAR',但我只得到warning 但没有结果。

【问题讨论】:

  • 错误非常明显,你不能将数组传递给函数,它必须是一个字符串。确认您传递给它的内容实际上是一个字符串。
  • @Script47 你的意思是我应该改变` 'value' => array($start, $end),` 到'value' =&gt; $start, $end, ?
  • 试一试然后发现,我实际上并没有正确地查看你的代码。
  • 顺便说一句,您可以通过使用准备好的语句错过转义方面。
  • 而不是使用 mysqli_real_escape_string 查看带有绑定参数的准备好的语句。这是将用户数据放入查询的首选方法。使用不同的数据多次执行相同的查询时效率更高,并且有助于消除人为错误,以防您忘记转义您认为可以使用的 15 个列表中的单个变量。

标签: php wordpress


【解决方案1】:

如果在这种情况下您只有两个值要比较,您可以设置多个元查询:

query_posts(
    array(
        'post_type' => 'post',
        'order'          => 'ASC',
        'posts_per_page' => -1,
        'cache_results' => false,
        'no_found_rows' => true,
        'update_post_meta_cache' => false, 
        'update_post_term_cache' => false, 
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key'       => 'usp-custom-14',
                'value'     => $start[0],
                'compare'   => 'LIKE',
            ),
            array(
                'key'       => 'usp-custom-14',
                'value'     => $end[0],
                'compare'   => 'LIKE',
            )
        )
    )
);

【讨论】:

  • 嗯,这实际上是一种更好的方法,我需要使用 AND 而不是 OR tho。我会接受的,谢谢
【解决方案2】:

要将其标记为已回答,您需要将字符串而不是数组传递给所述函数:

改变,

'value'   => array($start, $end),

'value'   => $start . $end,

正如我在评论中提到的,请考虑改用prepared statements,它更安全,并且您不必转义值。

【讨论】:

  • 在旁注中,如果我刷新页面,我将如何保留变量?如果我需要的话,不知道如何使用 SESSION..
  • 你能提供一个准备好的陈述的例子吗?
  • '你能提供一个准备好的陈述的例子吗?' - 我提供的链接有很多关于如何使用它们的例子。听起来可能很刺耳,但阅读手册比我告诉你的要好得多,原因有两个,手册是原始来源,所以它会更深入,它会让你学习并变得自力更生。
  • '如果我刷新页面,我将如何保留变量?' - 多种方式,cookies,会话,数据库或文件。
  • 如果我做$start . $end,我得到零结果,如果我做$start, $end,我只得到关于$start的结果
猜你喜欢
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
相关资源
最近更新 更多