【问题标题】:mysqli_real_escape_string with array in php? [duplicate]mysqli_real_escape_string 与 php 中的数组? [复制]
【发布时间】:2018-01-20 15:50:24
【问题描述】:

我的代码是这样的

 public function addQuestions($data){


    $ans = array();
    $ans[1] = $data['ans1'];
    $ans[2] = $data['ans2'];
    $ans[3] = $data['ans3'];
    $ans[4] = $data['ans4'];
    $ans= mysqli_real_escape_string($this->db->link, $data[$ans]);

}

这是在这个sql函数中使用数组的正确方法吗??

【问题讨论】:

  • mysqli_real_escape_string第二个参数是escape stringmysqli_real_escape_string ( mysqli $link , string $escapestr )
  • 不得不提。您不应该为 sql 查询转义数据 - 您应该使用准备好的和参数化的查询。这样,您实际上是在执行安全可靠的查询,并且不会破坏数据。双赢
  • 由于有很多答案建议使用 array_walkarray_map 之类的函数,因此我建议您查看此答案以解释差异:stackoverflow.com/a/3432266/4796321
  • 您的代码和方法已经过时了至少十年。我们都在使用参数化查询,不必再担心转义任何内容。我建议你在谷歌上搜索一下,看看我们在说什么。

标签: php mysql arrays function mysqli


【解决方案1】:

既然你想对数组$ans的每个元素做一些事情,那么使用array_map()是最合适的,如下:

public function addQuestions($data){


    $ans = array();
    $ans[1] = $data['ans1'];
    $ans[2] = $data['ans2'];
    $ans[3] = $data['ans3'];
    $ans[4] = $data['ans4'];

    $escaped_ans = array_map(function( $e ) {
             return mysqli_real_escape_string( $this->db->link, $e);
    }, $ans );

【讨论】:

    【解决方案2】:

    我没有足够的声望来评论 Milan 的帖子,但要小心 array_walk,它不会改变你原来的数组。为了使 Milan 的代码真正影响您的数组,该函数必须是

    function myescape(&$val) //Note the '&' which calls $val by reference.
    {
        $val = mysqli_real_escape_string($val);
    }
    
    array_walk($ans, 'myescape');
    

    回答你的问题:

    public function addQuestions($data){
        $ans = array('',$data['ans1'],$data['ans2'],$data['ans3'],$data['ans4']);
        //I would recommend using an object/associative array in this case though, just the way $data is already
    
        $ans_escaped = array_map(function($val) {
            return mysqli_real_escape_string($this->db->link, $val);
        }, $ans);
    
        //do whatever you need to do with escaped array
    }
    

    不过,我的建议是真正研究准备好的陈述。它可能看起来只是你不想费心的额外工作 - 一开始 - 但一旦你学会了它,你就再也不想做任何其他方式了。

    【讨论】:

      【解决方案3】:

      由于您有一个数组,并且您希望在数组的每个元素上使用mysqli_real_escape_string,您可以使用array_walk()

      function myescape($val)
      {
          return mysqli_real_escape_string($val);
      }
      

      ...然后

      array_walk($ans, 'myescape');
      

      【讨论】:

        【解决方案4】:

        如果您使用 MYSQL PDO,则不需要添加“mysqli_real_escape_string”,因为绑定后所有变量都是安全的(来自 SQL 注入)

        http://php.net/manual/en/pdostatement.bindparam.php

        【讨论】:

        • 不管怎样,如果使用prepared和bound statements,函数是多余的
        猜你喜欢
        • 1970-01-01
        • 2017-03-20
        • 2016-07-08
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-31
        • 2016-11-10
        相关资源
        最近更新 更多