Декодирование JSON в класс с последующей вставкой в запрос MySQL

#php #mysql #json

#php #mysql #json

Вопрос:

У меня есть функция php, которая создает массив JSON, который затем публикуется в моем веб-сервисе. Функция работает нормально, но веб-сервис вызывает у меня некоторые проблемы.

Я использую json_decode для декодирования переданной строки и присвоения значений классу. Это работает нормально. Я использую следующее для декодирования, а затем присвоения моему классу

 $obj = json_decode($json, true);
$classObj = new AppointmentList();
foreach ($obj  as $key => $value)
    $classObj->{$key} = $value;

var_dump($json);
var_dump($obj);
var_dump($classObj);
  

Дамп дает мне это

array(1) { ["AppointmentList"]=> array(10) { ["id"]=> string(0) "" ["MeetingId"]=> NULL ["MeetingName"]=> string(7) "derwent" ["DateTimeFrom"]=> string(13) "20th Oct 2016" ["Length"]=> string(0) "" ["Room"]=> string(4) "gere" ["Venue"]=> string(4) "gere" ["DateCreated"]=> string(10) "2016-10-20" ["DateDue"]=> string(10) "2016-10-20" ["UserId"]=> string(9) "JohnsonPa" } }

object(AppointmentList)#1 (11) { ["id"]=> string(0) "" ["MeetingId"]=> string(0) "" ["MeetingName"]=> string(0) "" ["DateTimeFrom"]=> string(0) "" ["Length"]=> string(0) "" ["Room"]=> string(0) "" ["Venue"]=> string(0) "" ["DateCreated"]=> string(0) "" ["DateDue"]=> string(0) "" ["UserId"]=> string(0) ""

["AppointmentList"]=> array(10) { ["id"]=> string(0) "" ["MeetingId"]=> NULL ["MeetingName"]=> string(7) "derwent" ["DateTimeFrom"]=> string(13) "20th Oct 2016" ["Length"]=> string(0) "" ["Room"]=> string(4) "gere" ["Venue"]=> string(4) "gere" ["DateCreated"]=> string(10) "2016-10-20" ["DateDue"]=> string(10) "2016-10-20" ["UserId"]=> string(9) "JohnsonPa" } }

Список встреч заполнен.

Однако моя проблема заключается в получении этих данных, чтобы поместить их в SQL-запрос. Я перепробовал множество различных способов получения данных ($classObj-> AppointmentList-> MeetingName, $ classObj.[‘MeetingName’] и т.д. и т.п. и т.п.) И это либо выдает мне ошибку об использовании массива, либо вообще ничего не показывает.

Как мне получить эти данные для вставки в SQL-запрос? Мой текущий (который неверен) выглядит следующим образом

 $query = "REPLACE INTO AppointmentList (id, MeetingId, MeetingName, DateTimeFrom, Length, Room, Venue, DateCreated, DateDue, UserId) VALUES (".$classObj['id'].", ".$classObj['MeetingId'].", '".$classObj['MeetingName']."', '".$classObj['DateTimeFrom']."', ".$classObj['Length'].", '".$classObj['Room']."', '".$classObj['Venue'].", STR_TO_DATE(".$classObj['DateCreated'].", '%Y%m%d'), STR_TO_DATE(".$classObj['DateDue'].", '%Y%m%d'), '".$classObj['UserId']."');";
  

Комментарии:

1. Пожалуйста, при любых обстоятельствах, найдите время для чтения xkcd.com/327 и php.net/manual/en/security.database.sql-injection.php Если возможно, проведите дополнительные исследования, но тем не менее: не развертывайте свой код на каком-либо интернет-сервере, пока вы его не очистите. Спасибо!

2. Я также дам вам положительный отзыв, если вы измените свой скрипт на использование PDO и подготовленных инструкций: php.net/manual/en/pdo.prepared-statements.php

3. Код очищается задолго до того, как он дойдет до этой стадии 🙂

Ответ №1:

Я думаю, что в вашем $query вместо $classObj['Venue'] этого должно быть $classObj['AppointmentList']['Venue']

Комментарии:

1. Вы думаете? Вы не уверены?

2. Я думаю, и я не уверен

Ответ №2:

Ваш $classObj — это объект, а не массив. В вашем классе ‘AppointmentList’ вы должны определить некоторые методы для получения атрибутов, которые вы устанавливаете в своем цикле.

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

 $query = "REPLACE INTO AppointmentList (id, MeetingId,...etc...) VALUES ('"$classObj->get_id()."', ".$classObj->get_MeetingId()."');"; 
  

Создайте массив, в который можно поместить ваши объекты, если вы собираетесь использовать более одного из них. Затем вы могли бы загрузить их в свою базу данных следующим образом:

 for($i=0; $i<sizeof($somearray);$i  ){
$query = "REPLACE INTO AppointmentList (id, MeetingId,...etc...) VALUES ('"$somearray[$i]->get_id()."', ".$somearray[$i]->get_MeetingId()."');"; 
//SQL PDO insertion here
  

}