Здравствуйте! Есть функция, делающая update базы данных Код (Text): public function update($query, $args) { $pdo = $this->dbConnect(); $stmt = $pdo->prepare($query); foreach ($args as $key => $value) $stmt->bindParam($key, $value); return $stmt->execute(); } функция получает следующие параметры Код (Text): $query = "UPDATE `articles` SET `title` = :title, `content` = :content WHERE `id_article` = :id_article"; Код (Text): $args = array(':title' => $title, ':content' => $content, ':id_article' => $id_article) Вобщем вызов идет так: Код (Text): $result = $this->dbDriver->update($query, array(':title' => $title, ':content' => $content, ':id_article' => $id_article)); if ($result) return true; else return false; Проблема в том, что bindParam, помещенный внутри foreach отрабатывает без ошибок, но неправильно. Вместо :title и :content подставляется $id_article, то есть вместо заголовка и текста статьи вижу айдишник. Если сделать втупую: Код (Text): public function update($query, $args) { $pdo = $this->dbConnect(); $stmt = $pdo->prepare($query); /*foreach ($args as $key => $value) { $stmt->bindParam($key, $value); }*/ $stmt->bindParam(':id_article', $args[':id_article']); $stmt->bindParam(':title', $args[':title']); $stmt->bindParam(':content', $args[':content']); return $stmt->execute(); } , то все работает прекрасно. Где ошибка?
странно, я пробовал и на 5.2 и на 5.3, у меня не отрабатывает, казалось бы такая простая конструкция. Причем работает одинаково, что так $value, что так &$value. На мой взгляд что здесь передавать по ссылке? $value и так содержит значение массива. Но все равно спасибо.
на взгляд авторов PDO биндится переменная, а не значение. значит правильным синтаксисом будет Код (Text): foreach($args as $key => &$value) это и в мануале есть. проверь себя еще раз. может не сохранив текст в редакторе протестировал или типа того
Точно! Не по значению! Все получилось. Спасибо, мужики! Еще у меня вопрос остался: обязательно ли с точки зрения безопасности указывать третий параметр, типа PDO:ARAM_INT или PDO:ARAM_STR? bindParam(':title', $title, PDO:ARAM_STR)
PHP: public static function getLastId($value) { $db = Db::getConnection(); $sql = 'SELECT * FROM :table ORDER BY id DESC LIMIT 1'; $result = $db->prepare($sql); $result->bindParam(':table', $value, PDO::PARAM_STR); // не работает не пойму почему return $result->execute(); } Народ! Подскажите, что не так? Почему не отрабатывает?
А более развернутого ответа я не достоин? PHP: public static function getLastId() { $db = Db::getConnection(); $sql = 'SELECT * FROM post ORDER BY id DESC LIMIT 1'; $result = $db->prepare($sql); return $result->execute(); } Почему тогда это возвращает результат? PS: Прошу лесом не отправлять, а доходчиво объяснить глупцу. Реально смотрю в мануал и ни чего не понимаю.
Результат вернут все методы которые начинаются с fetch --- Добавлено --- А что он тебе возвращает? Дай скажу TRUE or FALSE --- Добавлено --- вижу метод называется getLastId. Получение идентификатора последней вставленной записи уже реализован в PDO http://php.net/manual/ru/pdo.lastinsertid
За fetch благодарю, не знал Про этот метод я знаю, не подходит он мне, т.к. индификатор нужно узнать в другой сессии. (или я опять что-то путаю). Но все-же как так? PHP: public static function getLastId() { $db = Db::getConnection(); $sql = 'SELECT * FROM post ORDER BY id DESC LIMIT 1'; $result = $db->prepare($sql); $result->execute(); return $result->fetchColumn(); } это работает PHP: public static function getLastId($value) { $db = Db::getConnection(); $sql = 'SELECT * FROM :table ORDER BY id DESC LIMIT 1'; $result = $db->prepare($sql); $result->bindParam(':table', $value, PDO::PARAM_STR); $result->execute(); return $result->fetchColumn(); } а это нет!
Имена столбцов, таблиц не могут быть заменены так. В общем, тебе придется прибегнуть к обычной конкатенации, или же жестко прописать в сам запрос имя таблицы, У меня ни разу не было потребности, чтобы менять имя таблицы, ибо для каждой таблицы свой класс.
Ок, спасибо. Я уже смерился. Просто этот код используется в нескольких местах и с разными таблицами, поэтому хотел вынести в отдельный метод.
PHP: /** * Возвращает id будущей записи * @return <p>id будущей записи</p> */ public static function getNextId($value) { if (isset($value) && (strlen($value) > 0)) { $db = Db::getConnection(); $sql = 'SELECT * FROM ' . $value . ' ORDER BY id DESC LIMIT 1'; $result = $db->prepare($sql); $result->execute(); return $result->fetchColumn() + 1; } else { return 0; } } Переработал метод, вдруг кому интересно будет.
вместо PHP: if (isset($value) && (strlen($value) > 0)) { Можно PHP: if (!empty($value)) { Относительно док-блока, сразу после @return должен идти тип переменной далее описание т.е. @return int ид следующей записи. Программист то разберется что ты имел в виду и какой тип вернет метод взглянув на ее реализацию, но если ты в будущем планируешь генерировать документацию на основе этих док-блоков, то у тебя получится не то, что требуется. Документация по phpDocumentator Мне интересно, зачем знать id будущей записи?
Спасибо. При определенных условия, необходимо создать директорию с определенным именем для нового поста. (При этом пост еще не записан в базу) Решил привязать к id поста.
@mahmuzar, Возможно, спорить не буду, но это всё на что хватило мозгов. Php для меня пока дремучий лес, многое не знаю.