У меня есть класс, который получает строки с именами полей моей базы данных и соответствующими значениями. Я хочу создать новую запись и заранее проверить, существует ли поле в моей базе данных.
Однако, поскольку объект создается непосредственно перед тем, как я проверяю, доступно ли свойство для чтения, он выдает исключение:
Сбой здесь: Предупреждение: недопустимый тип смещения в isset или пустой
Ошибка выдается здесь:
try{
$accessor->isWritable($field['name'], $hw);
}catch (\Exception $exception){
throw new \Exception('Fails Here: '.$exception->getMessage());
}
Я знаю, что это опасно и может причинить вред из-за инъекции, но это внутренний проект, в котором я только пользователь, и в настоящее время я не могу придумать более элегантный способ сделать это, не написав add_new_row
или аналогичная функция для каждой таблицы.
Hardware
имеет столбцы SerialNo
, Firmware
а также BuyDate
,Product
имеет столбцы isActive
а также Price
Через ajax теперь я хочу отправить массив для каждой из таблиц, чтобы создать новую запись. Я получаю массив, как это через $.post()
:
$data = array(
'table' => 'Hardware',
'values' => array(
0 => array(
'name' => 'SerialNo',
'value' => '1234'
),
1 => array(
'name' => 'Firmware',
'value' => 'v1.04'
),
2 => array(
'name' => 'BuyDate',
'value' => '2018-08-23'
),
)
)
Таким образом, чтобы использовать один и тот же класс для каждой таблицы (Hardware
а также Product
например) Я пытался сделать это:
$accessor = PropertyAccess::createPropertyAccessor();
if($data['table'] === 'Hardware'){
$obj = new Hardware();
}else{
$obj = new Product();
}
foreach ($data['values'] as $field) {
try{
$accessor->isWritable($field['name'], $hw);
}catch (\Exception $exception){
throw new \Exception('Fails Here: '.$exception->getMessage());
}
if (!$accessor->isWritable($field['name'], $obj)) {
throw new InvalidArgumentException('Could not write: ' . $field['name']);
}
$accessor->setValue($field['name'], $obj, $field['value']);
$em->persist($obj);
}
Это даже не исключение, и я думаю, что это потому, что $obj
выглядит так (это то, что означает выброшенная ошибка, не так ли?)
Hardware {#2708 ▼
-id: null
-serialNo: null
-firmware: null
-buyDate: null
Есть ли способ сделать это так, как я этого хотел?
Вы путаете параметры для isWritable()
а также setValue()
, Если вы поменяете их местами так, ваш код будет работать так, как ожидается:
if (!$accessor->isWritable($obj, $field['name'])) {
throw new InvalidArgumentException('Could not write: ' . $field['name']);
}
$accessor->setValue($obj, $field['name'], $field['value']);
Других решений пока нет …