Здравствуйте. Подскажите пожалуйста как мне по id достать объект и "расфосовать" поля в соответсвующие textfield? Сейчас возникает ошибка которую мне не удается понять:
Имею список имен
При нажатии на кнопку "Изменить" имею ошибку:
Notice: Array to string conversion in DatabaseStatementBase->execute() (line 2171 of C:\xampp\htdocs\dru2.ru\includes\database\database.inc).
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' NULL, , '', '', '', '1', '', 'post', , , ))' at line 1: SELECT n.id AS id, n.name AS name, n.phonenumber AS phonenumber, n.tags AS tags, n.created_at AS created_at, n.updated_at AS updated_at FROM {phonebook} n WHERE (n.id IN (:db_condition_placeholder_0_0, :db_condition_placeholder_0_1, :db_condition_placeholder_1, , :db_condition_placeholder_3, , :db_condition_placeholder_5, :db_condition_placeholder_6, :db_condition_placeholder_7, :db_condition_placeholder_8, :db_condition_placeholder_9, :db_condition_placeholder_10, , , )) ; Array ( [:db_condition_placeholder_1] => [:db_condition_placeholder_3] => [:db_condition_placeholder_5] => [:db_condition_placeholder_6] => [:db_condition_placeholder_7] => [:db_condition_placeholder_8] => 1 [:db_condition_placeholder_9] => [:db_condition_placeholder_10] => post [:db_condition_placeholder_0_0] => Array ( [0] => 1 ) [:db_condition_placeholder_0_1] => phonebook_form ) in phonebook_form() (line 88 of C:\xampp\htdocs\dru2.ru\sites\all\modules\phonebook\phonebook.module).
Код моего phonebook_menu и phonebook_form:
function phonebook_menu()
{
$items = array();
$items['admin/config/content/phonebook'] = array(
'title' => 'Phone Book',
'description' => 'Конфигурирование списка телефонный номеров',
'page callback' => 'phonebook_list',
'access arguments' => array('administer site configuration'),
);
$items['admin/config/content/phonebook/list'] = array(
'title' => 'Список телефонных номеров',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 1,
);
// phone add form
$items['admin/config/content/phonebook/add'] = array(
'title' => 'Добавить номер',
'page callback' => 'drupal_get_form',
'page arguments' => array('phonebook_form'),
'access arguments' => array('administer site configuration'),
'type' => MENU_LOCAL_TASK,
'weight' => 2,
);
// phone edit form
$items['admin/config/content/phonebook/%/edit'] = array(
'title' => 'Редактировать номер',
'page callback' => 'drupal_get_form',
'page arguments' => array('phonebook_form', 4),
'access arguments' => array('administer site configuration'),
'type' => MENU_CALLBACK,
);
// phone delete
$items['admin/config/content/phonebook/%phone/delete'] = array(
'title' => 'Удалить номер',
'page callback' => 'phonebook_delete',
'page arguments' => array(4),
'access arguments' => array('administer site configuration'),
'type' => MENU_SUGGESTED_ITEM,
);
$items['phonebook'] = array(
'title' => 'Телефонные номера',
'page callback' => '_phonebook_page',
'access arguments' => array('access content'),
);
$items['phonebook/%phone/items'] = array(
'title' => 'Содержимое телефонной книги',
'page callback' => 'phone_content',
'page arguments' => array(1),
'access callback' => TRUE,
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
function phonebook_form($form, $phone = null)
{
var_dump($phone);
if ($phone != null) {
$phone = db_select('phonebook', 'n')
->fields('n', array('id', 'name', 'phonenumber', 'tags', 'created_at', 'updated_at'))
->condition('n.id', $phone)
->execute()->fetchAll();
}
$form['name'] = array(
'#title' => t('Имя контакта'),
'#description' => t('Вставьте имя контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone[0]->name : '',
'#required' => true,
);
$form['phonenumber'] = array(
'#title' => t('Номер контакта'),
'#description' => t('Вставьте телефонный номер контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone : '',
'#required' => true,
);
$form['tags'] = array(
'#title' => t('Теги контакта'),
'#description' => t('Вставьте теги контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone : '',
'#required' => true,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => $phone ? t('Сохранить') : t('Добавить'),
);
if ($phone) {
$form['id'] = array(
'#type' => 'value',
'#value' => $phone,
);
}
return $form;
}
Я понимаю что ошибка при запросе в бд из функции phonebook_form, а что не правильно я делаю?
Комментарии
Картинка не вставилась.
https://yadi.sk/i/IK-gUM_KcUXdH
Где-то в запросе вместо "строки" "массив" передали..
Без подсветки, код читать сложно..
На панели поля редактирования комментария есть кнопочка "Вставка кода"(6-я с конца)..
Поправте, пожалуйста, пост..
$phone - integer или string ?
нужно дебажить строки с запросом
и зачем кстати в текстовые поля в значения по умолчанию вставлять массив?
Переменная $phone была строковой, сделал преобразование в integer. Теперь появляется такая ошибка (вложение pic3)
P.S. Пробовал вставлять массив, потому что после запроса в бд, вернется объект и переменная $phone - станет ассоц.массивом с ключами 'id', 'name', 'phonenumber', 'tags', 'created_at', 'updated_at'. Пока запрос не проходит.
Это массив-)
ОБратите внимание на параметры функции-конструктора формы..
Ничего не настроживает?-)
Да, был массив потому что в функции phonebook_menu, ключ у массива $items был ['admin/config/content/phonebook/%/edit']
Затем, после знака процента, я добавил слово phone, получилось: ['admin/config/content/phonebook/%phone/edit']
и аргументом
<?php'page arguments' => array('phonebook_form', 4)?>
- стало добавляться значение типа string.В функции phonebook_form, я сделал преобразование $phone = (int)$phone.
Теперь появляется ошибка, представленная на изображении, которое я прикрепил в своём предыдущем сообщении.
На данный момент, у меня код такой (часть)
Функция phonebook_menu:
<?php
...
// phone edit form
$items['admin/config/content/phonebook/%phone/edit'] = array(
'title' => 'Редактировать номер',
'page callback' => 'drupal_get_form',
'page arguments' => array('phonebook_form', 4),
'access arguments' => array('administer site configuration'),
'type' => MENU_CALLBACK,
);
...
?>
Функция phonebook_form:
<?phpfunction phonebook_form($form, &$form_state, $phone = null)
{
$phone = (int)$phone;
var_dump($phone);
if ($phone != null) {
$phone = db_select('phonebook', 'n')
->fields('n', array('id', 'name', 'phonenumber', 'tags', 'created_at', 'updated_at'))
->condition('n.id', $phone)
->execute()->fetchAll();
}
$form['name'] = array(
'#title' => t('Имя контакта'),
'#description' => t('Вставьте имя контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone[0]->name : '',
'#required' => true,
);
$form['phonenumber'] = array(
'#title' => t('Номер контакта'),
'#description' => t('Вставьте телефонный номер контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone : '',
'#required' => true,
);
$form['tags'] = array(
'#title' => t('Теги контакта'),
'#description' => t('Вставьте теги контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone : '',
'#required' => true,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => $phone ? t('Сохранить') : t('Добавить'),
);
if ($phone) {
$form['id'] = array(
'#type' => 'value',
'#value' => $phone,
);
}
return $form;
}?>
Кто знает почему у меня появляется ошибка, отпишитесь пожалуйста.
изначально туда записывается либо NULL, либо значение из аргумента урла, а потом уже только там будет массив, меня интересовало, что передается в метод condition()
я имел ввиду, что должно быть либо то, либо другое
а вот это не нужно было делать, нужно оставить ['admin/config/content/phonebook/%/edit'] и в урл 4-м аргументом записывать id
зачем записывать массивы в значения полей?
'title' => 'Редактировать номер',
'page callback' => 'drupal_get_form',
'page arguments' => array('phonebook_form', 4),
'access arguments' => array('administer site configuration'),
'type' => MENU_CALLBACK,
);
{
var_dump($phone);
if ($phone != null) {
$phone = db_select('phonebook', 'n')
->fields('n', array('id', 'name', 'phonenumber', 'tags', 'created_at', 'updated_at'))
->condition('n.id', $phone)
->execute()->fetchObject();
}
$form['name'] = array(
'#title' => t('Имя контакта'),
'#description' => t('Вставьте имя контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone->name : '',
'#required' => true,
);
$form['phonenumber'] = array(
'#title' => t('Номер контакта'),
'#description' => t('Вставьте телефонный номер контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone->phonenumber : '',
'#required' => true,
);
$form['tags'] = array(
'#title' => t('Теги контакта'),
'#description' => t('Вставьте теги контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone->tags : '',
'#required' => true,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => $phone ? t('Сохранить') : t('Добавить'),
);
if ($phone) {
$form['id'] = array(
'#type' => 'value',
'#value' => $phone->id,
);
}
return $form;
}
Как ты узнал что такой вид выборки необходимо применять? Он работает спасибо большое!
А в каких случаях, в функции menu, в ключе массива $items, после знака процента дописывают имя переменной?
(прим.:
<?php $items['admin/config/content/phonebook/%param1/edit'] = array( ......)?>
)в данном случае в каллбек функцию передается возвращаемое значение функции param1_load, если такая имеется (к примеру %node(node_load), %user(user_load))