2016-10-14 3 views
1

Я пытаюсь запустить некоторый простой PHP-код, который извлекает форматированный файл JSON и вставляет его в базу данных.Nulls вставляется в базу данных MySQL по ошибке

Код возвращает, что новая запись была создана успешно. Однако, когда я смотрю на Databse каждое значение 0.

//read the json file contents 
$jsondata = file_get_contents('http://tally.fit/empdetails.json'); 

//convert json object to php associative array 
$data = json_decode($jsondata, true); 

//get the employee details 
$id = $data['empid']; 
$name = $data['personal']['name']; 
$gender = $data['personal']['gender']; 
$age = $data['personal']['age']; 
$streetaddress = $data['personal']['address']['streetaddress']; 
$city = $data['personal']['address']['city']; 
$state = $data['personal']['address']['state']; 
$postalcode = $data['personal']['address']['postalcode']; 
$designation = $data['profile']['designation']; 
$department = $data['profile']['department']; 

//insert into mysql table 
$sql = "INSERT INTO tbl_emp(empid, empname, gender, age, streetaddress, city, state, postalcode, designation, department) 
VALUES('$id', '$name', '$gender', '$age', '$streetaddress', '$city', '$state', '$postalcode', '$designation', '$department')"; 

JSON:

{ 
    "emp": "SJ011MS", 
    "personal": { 
     "name": "Smith Jones", 
     "gender": "male", 
     "age": "28", 
     "address": { 
      "streetaddress": "7 24th Street", 
      "city": "new york", 
      "state": "NY", 
      "postalcode": "10038" 
     } 
    }, 
    "profile": { 
     "designation": "Deputy General", 
     "department": "Finance" 
    } 
} 
+0

Вы пытались «echo $ id;» видеть, что находится в переменных? Означает ли это значение null или фактический идентификатор? Это может помочь вам при отладке. – Kenji

+0

Если ничего другого - у вашего JSON есть 'emp' для идентификатора сотрудника, и вы используете' empid' – andrewsi

+2

. Вы уязвимы для [SQL-инъекций] (http://bobby-tables.com). –

ответ

0

Неправильный доставленный JSON URL в исходном вопросе. Это причина для json_decode(), возвращающего false и неявное нажатие пустых значений в базу данных.

Однако исходный код вопроса имеет кучу недостатков, которые я хотел бы очертить. Внешний источник, который вы загружаете, разбираете и помещаете в свою базу данных, может содержать вредоносную информацию. Не доверяйте данным, которые вы извлекаете из внешних источников, и фильтруйте или дезинфицируйте значения.

Если удаленный источник будет содержать некоторую SQL-подобную информацию (по любой причине), ваше веб-приложение будет уязвимым для SQL-инъекции.

Относительно вам код, который означает, что с двумя основными примерами:

$connection = new \PDO(
    'mysql:dbname=database_name;host=127.0.0.1', 
    $username, 
    $password 
); 

// cast to integer values if that's the expected type 
$id = (int)$data['empid']; 

// escape literals and "disarm" injected statements 
$streetaddress = $connection->quote(
    $data['personal']['address']['streetaddress'] 
); 

Использование подготовленные заявления бы предложение обойти такого рода возможности SQL-инъекции. Кроме того, вы можете рассмотреть использование фреймворка или обертки, например Doctrine DBAL или PDO, для дальнейшей разработки базы данных на PHP.

+0

очень благодарны за советы :) – Technaut

0

Эта строка JSON, возвращаемый сервером не является действительным. Невозможно разобрать json_decode.

0

Ваш JSON недействителен. Смотри ниже.

"profile":{ 
      "designation":"Deputy General", 
      "department":"Finance", //Remove Comma here for valid JSON 
      } 

Вы можете проверить это в будущем, используя var_dump() на вашем json_decode(), а затем подтвердить свой JSON строку с JSON Validation tool.

Смежные вопросы