【问题标题】:How to use mysqli_real_escape_string to san an array parsed by json ajax?如何使用 mysqli_real_escape_string 来 san 由 json ajax 解析的数组?
【发布时间】:2014-06-01 02:26:57
【问题描述】:

我有一个 ajax 解析数组

jquery

if (conceptName == "payall"){
var payall = confirm ("You are about paying for some items.");
if (payall == true ){
   var checkedB = new Array();
    $("input.NP:checkbox:checked").each(function(){
       checkedB.push($(this).attr("class"));
   });

   // ajax for sending the selected products array for the payment
    $.ajax({
      type: 'POST',
      url: "ord/payforit.php",
      data: {checkedB:checkedB},
      dataType: 'json',
      cache: false,
      success: function(resultpay) {
                     alert (resultpay);

       } 
     });
  } else {
    alert ("Ok, Do you still wanna add items?");
  }

php

require "dbconnection.php";
$getarr = mysqli_real_escape_string($db,$_POST["checkedB"]);  
echo json_encode ($getarr);

如果我使用 $_POST["checkedB"] 而不进行清理,则数组解析没有问题,但是使用上面的代码我将拥有

<br /> 
<b>Warning</b>:  mysqli_real_escape_string() expects parameter 2 to be string, array given in     <b>e/ru/ord/payforit.php</b> on    line <b>21</b><br />
null

我的代码出了什么问题,我确信我的数据库连接很好,我的图片上传使用同一目录没有错误。

请帮帮我。

赞赏。

【问题讨论】:

  • 那么:清理数组是什么意思?
  • :哦,你不知道消毒是什么意思?????
  • 我很清楚这意味着什么。那么,给定一个像数组这样的数据结构,你会如何期望将它作为数据库调用的字符串进行清理?
  • 你需要遍历数组。
  • 如果使用 JSON 编码,为什么需要清理值?如果要将值插入 SQL 查询,则只需使用 mysqli_real_escape_string

标签: php jquery ajax arrays json


【解决方案1】:

您应该遍历一个数组并将其应用于值(如果您正在处理 post 和 get,则将其应用于键)

foreach ( $_POST["checkedB"] as $k=>$v ) {
    ${mysqli_real_escape_string( $db, $k )} = mysql_reali_escape_string( $db, $v );
}

echo $someKeyInArray;

或者重新编译一个数组

$array = array();
foreach ( $_POST["checkedB"] as $k=>$v ) {
    $array[mysqli_real_escape_string( $db, $k )] = mysqli_real_escape_string( $db, $v );
}

echo $array['someKeyInArray'];

如果您的数组模型包含多个数组,那么您将需要使用一个函数来正确地遍历所有数组,例如 (未测试)

function mysqli_escape_array( $arr, $db = false ) {
    if ( ! $db ) {
        return false;
    }
    $array = array();
    foreach ( $arr as $k=>$v ) {
        if ( is_array( $v ) ) {
            $array[mysqli_real_escape_string( $db, $k )] = mysqli_escape_array( $v, $db );
        } else {
            $array[mysqli_real_escape_string( $db, $k )] = mysqli_real_escape_string( $db, $v );
        }
    }
    return $arr;
}

$array = mysqli_escape_array( $_POST['checkedB'], $db );

echo json_encode( $array );

【讨论】:

  • 您调用的是mysql 而不是mysqli,并且您缺少第一个参数。
  • 如果没有提供数据库,mysql_real_escape_string() 将默认为活动连接。至少自它推出以来它最初是这样的。
  • 他没有使用mysql_real_escape_string,他使用的是mysqli_real_escape_string。 mysqli 不像 mysql 那样默认。
  • It sure doesright 函数编辑。
  • 重新编译数组对我有用,谢谢,如果您也可以投票支持我的问题,我们将不胜感激。再次感谢您的宝贵回复。
【解决方案2】:

你需要遍历数组:

$getarr = array();
foreach($_POST['checkedB'] AS $val) {
    $getarr[] = mysqli_real_escape_string($db, $val);
}
echo json_encode($getarr);

【讨论】:

  • 警告:为 foreach() 提供的参数无效
  • 抱歉,checkedB 中有错字。
  • 那么你的_POST 不是一个数组。编辑:那就行了。
  • 我的密钥如何被利用?我正在创建一个数值数组。
  • @Barmar 感谢您的回复,我再次投票赞成您的答案,您的答案完美无缺,简单实用,我不喜欢头脑变得如此复杂。如果您也投票支持我的问题,我将不胜感激。再次感谢您的宝贵回复。
猜你喜欢
  • 2016-04-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2017-05-18
  • 1970-01-01
  • 2021-01-17
相关资源
最近更新 更多