Я не могу вставить JSON в MongoDB с помощью PHP-скрипта - PullRequest
0 голосов
/ 02 июня 2018
<?php
    $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
    try {

        $link = mysqli_connect('localhost', 'root', '')
        or die('No se pudo conectar: ' . mysqli_error());
    mysqli_select_db($link,'classicmodels5') or die('No se pudo seleccionar la base de datos');

           $query = "select c.customerNumber,c.customerName,c.city as customerCity, c.country as customerCountry,c.salesRepEmployeeNumber from customers as c";
           $result = mysqli_query($link,$query);
                   $isFirst=0;
                   $isFirst2=0;
                   $isFirst3=0;
                   $isFirst4=0;
                   $json="";
                    while ($fila = mysqli_fetch_array($result)) {
                         $bulk = new MongoDB\Driver\BulkWrite;

                             $isFirst2=0;
                            $isFirst3=0;
                            $isFirst4=0;
                            extract($fila);

                            $json = $json."{";

                            //$json = $json.",{";
                            $json = $json.'"customerNumber":'.$fila["customerNumber"].',';
                            $json = $json.'"customerName":"'.$fila["customerName"].'",';
                            $json = $json.'"city":"'.$fila["customerCity"].'",';
                            $json = $json.'"country":"'.$fila["customerCountry"].'"';

                            //INICIO:INSERTAR PAYMENTS
                            $query2 = "select  p.checkNumber,p.amount from payments as p where p.customerNumber=".$fila["customerNumber"];
                            $result2 = mysqli_query($link,$query2);
                            if(mysqli_num_rows($result2)>0){
                                $json=$json.',"payments":[';
                            }
                            while ($fila2 = mysqli_fetch_array($result2)) {
                                extract($fila2);
                                if($isFirst2==1){
                                   $json = $json.",{";
                                }else{
                                   $json = $json."{";
                                }
                                     $json = $json.'"checkNumber":"'.$fila2["checkNumber"].'",';
                                     $json = $json.'"amount":"'.$fila2["amount"].'"}';
                                $isFirst2=1;

                            }
                            if(mysqli_num_rows($result2)>0){
                                $json=$json.']';
                            }
                            //FIN:INSERTAR PAYMENTS
                            //INICIO: INSERTAR EMPLOYEE
                            $query3 = "SELECT e.employeeNumber,e.lastName,e.extension,e.officeCode FROM employees as e where e.employeeNumber=".$fila["salesRepEmployeeNumber"];
                            $result3 = mysqli_query($link,$query3);
                                if(mysqli_num_rows($result3)>0){
                                    $json=$json.',"employees":[';
                                }
                                while ($fila3 = mysqli_fetch_array($result3)) {
                                extract($fila3);
                                if($isFirst3==1){
                                   $json = $json.",{";
                                }else{
                                   $json = $json."{";
                                }
                                   $json = $json.'"employeeNumber":"'.$fila3["employeeNumber"].'",';
                                   $json = $json.'"lastName":"'.$fila3["lastName"].'",';
                                   $json = $json.'"extension":"'.$fila3["extension"].'"';
                                   //INICIO:INSERTAR OFFICE

                                    $query4 = "SELECT o.officeCode,o.city,o.country FROM offices as o where o.officeCode=".$fila3["officeCode"];
                                    $result4 = mysqli_query($link,$query4);    
                                     if(mysqli_num_rows($result4)>0){
                                         $json=$json.',"officeCode":';
                                     }
                                     while ($fila4 = mysqli_fetch_array($result4)) {
                                     extract($fila4);
                                      if($isFirst4==1){
                                        $json = $json.",{";
                                     }else{
                                        $json = $json."{";
                                     }
                                       $json = $json.'"officeCode":"'.$fila4["officeCode"].'",';
                                       $json = $json.'"city":"'.$fila4["city"].'",';
                                       $json = $json.'"country":"'.$fila4["country"].'"}';

                                      $isFirst4=1;
                                     }

                                    //FIN:INSERTAR OFFICE

                                 $isFirst3=1;

                                }
                                if(mysqli_num_rows($result3)>0){
                                $json=$json.'}]';
                            }
                            //FIN:INSERTAR EMPLOYEE

                            $json = $json.'}';
                            echo $json."</br>";


                            //Hacer el insert 
                            $bulk->insert(json_decode($json));
                            $resultFinal = $manager->executeBulkWrite('test.prueba3', $bulk);
                            $json="";

                            $isFirst=1;
                        }
                        $json = str_replace("'", " ", $json);
                        echo $json;
                //echo $json;
       /* $bulk->insert(json_decode($json));
        $resultFinal = $manager->executeBulkWrite('test.customers', $bulk);
        var_dump($resultFinal);*/
    }catch(Exception $e) {
        echo "EXCEPTION: ".$e->getMessage(), "\n";
        exit;
    }

?>

Когда я выполняю вставку, каждый раз, когда я заканчиваю первый цикл, я получаю следующую ошибку, я не понимаю, так ли это, потому что JSON неверен или должен быть вставлен другим способом

    Warning: MongoDB\Driver\BulkWrite::insert() expects parameter 1 to be array, null given in C:\xampp2\htdocs\prac\index.php on line 111

EXCEPTION: Cannot do an empty bulk write

Мне нужно каждый раз, когда я заканчиваю первый цикл, вставлять документ JSON, чтобы на следующем круге добавить еще один, я получаю эту ошибку, но при проверке моего json в JSONLint я получаю, что это действительно.такое миграция с MySQL на MongoDB.

Это JSON, который выдает ошибку, которая, я думаю, правильно написана. Как вы думаете, где эта ошибка?Спасибо

{"customerNumber":144,"customerName":"Volvo Model Replicas, Co","city":"Lule�","country":"Sweden","payments":[{"checkNumber":"IR846303","amount":"36005.71"},{"checkNumber":"LA685678","amount":"7674.94"}],"employees":[{"employeeNumber":"1504","lastName":"Jones","extension":"x102","officeCode":{"officeCode":"7","city":"London","country":"UK"}}]}

1 Ответ

0 голосов
/ 03 июня 2018

Я упростил ваш код до этого:

<?php
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
try {

    $json='{"customerNumber":144,"customerName":"Volvo Model Replicas, Co","city":"Lule�","country":"Sweden","payments":[{"checkNumber":"IR846303","amount":"36005.71"},{"checkNumber":"LA685678","amount":"7674.94"}],"employees":[{"employeeNumber":"1504","lastName":"Jones","extension":"x102","officeCode":{"officeCode":"7","city":"London","country":"UK"}}]}';
        $bulk = new MongoDB\Driver\BulkWrite;


        echo $json."</br>";


        //Hacer el insert
        $bulk->insert(json_decode($json));
        $resultFinal = $manager->executeBulkWrite('test.prueba3', $bulk);
        $json="";

        $isFirst=1;

}catch(Exception $e) {
    echo "EXCEPTION: ".$e->getMessage(), "\n";
    exit;
}

И печатается JSON и сохраненные данные делают mongodb

> db.prueba3.find().pretty()
{
    "_id" : ObjectId("5b13bbda65b9bb1f3e6b9922"),
    "customerNumber" : 144,
    "customerName" : "Volvo Model Replicas, Co",
    "city" : "Lule�",
    "country" : "Sweden",
    "payments" : [
        {
            "checkNumber" : "IR846303",
            "amount" : "36005.71"
        },
        {
            "checkNumber" : "LA685678",
            "amount" : "7674.94"
        }
    ],
    "employees" : [
        {
            "employeeNumber" : "1504",
            "lastName" : "Jones",
            "extension" : "x102",
            "officeCode" : {
                "officeCode" : "7",
                "city" : "London",
                "country" : "UK"
            }
        }
    ]
}

Пожалуйста, подтвердите, что этот пример работает в вашем случае.Если нет, вы можете сравнить $json, который определен в этом примере, и ваш $json перед комментарием //Hacer el insert.

В любом случае, если это возможно, пожалуйста, выделите вашу проблему.Включение такого огромного количества кода не так полезно, как меньшее.Чтобы помочь другим в ответе, вы можете использовать примерные данные вместо вставки кода с выборками из базы данных.

Конкатенация JSON из строки - очень плохая практика.Представьте, что одна из ваших строк содержит такой символ: "{".Вам удалось это избежать?

Потенциально проблема может быть связана с кодировкой Lule�.Вы используете Windows, возможно, ваш код вашего кода или базы данных SQL имеет кодировку, отличную от UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...