为foreach()警告提供的参数无效

时间:2015-07-24 08:43:27

标签: php mysql

我想在mysql表中插入json数组数据。我写了这段代码。

if (mysqli_connect_errno()){
    $response["success"] = 0;
    $response["message"] = "Database Error!";   
    die(json_encode($response));
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// Check connection
if ($con->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
echo "Connected successfully";

if(isset($_GET['doctorJson'])){

    $json = $_GET['doctorJson'];

    $array = json_decode($json, true);

    foreach($array as $item){

        $result = mysqli_query($con, "INSERT IGNORE INTO doctor_visit_track (id, doctor_name, doctor_email, date, time) VALUES 
            ('".$item['id']."', '".$item['doctorName']."', '".$item['doctorEmail']."', '".$item['date']."', '".$item['time']."')");

            }

    if($result){
        $response["message"] = "Success";
        echo json_encode($response);
    } else{
        $response["message"] = "Failure";
        echo json_encode($response);
        }
    }

mysqli_close($con);

当我使用xampp时,上面的代码工作正常。但是当我将此代码上传到服务器时,相同的代码会发出警告“为foreach()提供的无效参数”而不是插入表中。但是在xampp中使用,代码工作正常并成功插入数据。有人帮助我..

2 个答案:

答案 0 :(得分:0)

不是一个完整的答案,而是观察到您的代码容易受到 SQL注入的攻击。尝试:

$sql = <<<EOF
INSERT IGNORE INTO 
  doctor_visit_track (id, doctor_name, doctor_email, date, time) VALUES 
  ('?', '?', '?', '?"', '?')")
EOF;

$stmt = mysqli_prepare( $con, $sql);

foreach ($array as $item){
    mysqli_stmt_bind_param( $stmt, "sssss",
      $item['id'], $item['doctorName'], $item['doctorEmail'],
      $item['date'],$item['time']
      );
    $result = mysqli_stmt_execute($stmt);
    // rest of your code
};    

顺便提一下,你还有$ con和$ conn(2'n')作为你的连接变量 - 希望你的代码中没有这个。

我无法确定,但您的代码可能会混淆了面向对象的OO(面向对象)和程序形式的mysqli。坚持一个或另一个(理想的OO形式)

例如,在原始代码中,有人向您发送了类似于以下内容的恶意JSON对象:

{
"id" : "hackerid",
"doctorName" : "I am a Hacker",
"doctorEmail": "hacker@hacker.com",
"date": "1999-12-31",
"time": "\"); drop table doctor_visit_track; -- Muhahahaha "
}

......你对结果不满意。

答案 1 :(得分:0)

我遇到了类似的问题,原因是启用了PHP魔术引号,并将转义字符添加到json字符串。尝试禁用php.ini中的魔术引号:

magic_quotes_gpc =关