Добрый день господа, Есть проблема с записью данных в базу. Помогите решить. Вот такой фрагмент кода в обработчике формы: PHP: //Вставляем данные в базу данных. if (isset($_POST["naziv_doo"])) { //Вставляем данные, подставляя их в запрос $sql = mysql_query("INSERT INTO `DOO_1osnivac` (`naziv_doo`, `prezime`, `ime`, `broj_pasosa`, `pasos_datums`, `fms_pasos`, `adressa_monte`, `ustavni_fond`, `delatnost`, `derjavlanstvo`, `grad`, `id_document`) VALUES ('".$_POST['naziv_doo']."','".$_POST['prezime']."','".$_POST['ime']."','".$_POST['broj_pasosa']."','".$_POST['pasos_datums']."','".$_POST['fms_pasos']."','".$_POST['adressa_monte']."','".$_POST['ustavni_fond']."','".$_POST['delatnost']."','".$_POST['derjavlanstvo']."','".$_POST['grad']."','".$_POST['id_document']."')"); } В базе данных создана таблица с полями: (`naziv_doo`, `prezime`, `ime`, `broj_pasosa`, `pasos_datums`, `fms_pasos`, `adressa_monte`, `ustavni_fond`, `delatnost`, `derjavlanstvo`, `grad`, `id_document`) В таблицу успешно вставляются все данные, кроме последнего (id_document). Теперь, еще важные моменты, еще до вставки в базу есть фрагмент кода, приведу его отрывок: //Это пользователь вводит в форме текстовое поле. В базу проставляется, все ОК. empty($data['fms_pasos']); //Это пользователь выбирает из списка (тег селект), в базу проставляется. Все ОК. $data['delatnost'] = $_POST['delatnost']; empty($data['delatnost']); //Этого поля нет в форме, т.е., пользователь не заполняет поле 'id_document', обработчик формы присваивает документу уникальный номер, который нужен для различных задач, в том числе его нужно записать в базу. В базу не записывается. В чем может быть причина? if (empty($data['id_document'])) $data['id_document'] =uniqid(); Так как работает все кроме записи в базу id_document, соответственно именно в этом что то нужно доделать, вероятно, дописать одну-две строчки, вот никак не выходит сообразить, какие.
@kordiks1972 А почему ты посылаешь из пост данных сразу в запрос? --- Добавлено --- @kordiks1972 Попробуй так сделать, запрос: PHP: $sql = mysql_query("INSERT INTO `DOO_1osnivac` (`naziv_doo`, `prezime`, `ime`, `broj_pasosa`, `pasos_datums`, `fms_pasos`, `adressa_monte`, `ustavni_fond`, `delatnost`, `derjavlanstvo`, `grad`, `id_document`) VALUES (':naziv_doo, :prezime, :ime, :broj_pasosa, :pasos_datums, :fms_pasos, :adressa_monte, :ustavni_fond, :delatnost, :derjavlanstvo, :grad, :id_document')"); }
А почему ты посылаешь из пост данных сразу в запрос? Да, потому, что я только учусь, и других путей пока не знаю. Код (Text): VALUES (':naziv_doo, :prezime, :ime, :broj_pasosa, :pasos_datums, :fms_pasos, :adressa_monte, :ustavni_fond, :delatnost, :derjavlanstvo, :grad, :id_document')"); Спасибо попробую, хотя, из 12 строк не проставляется в базу только одна. Наверное, надо что то вот здесь дописать: if (empty($data['id_document'])) $data['id_document'] =uniqid();
@kordiks1972 я тоже учусь еще программированию php и mysql Покажи структуру таблиц. То-есть всю таблицу скинь сюда.
id_document - это первичный ключ? Или внешний? --- Добавлено --- если первый вариант, то его указывать вообще не нужно. Там должен быть автоинкремент. если второй, то он должен совпадать с одной из ячеек первичного ключа, на который ссылается. Ща придут ровные пацаны и всё правильно сформулируют
id_document - это первичный ключ? Или внешний? Это автоматическая нумерация документа, который генерирует скрипт. Вот такой код за это отвечает: PHP: $data['id_document'] =uniqid(); //заменяем переменные foreach($data as $field=>$value) $this->document->setValue($field, $value); if (!empty($data['server'])) { $temp_file="finish/dogovor_".$data['id_document'].".docx"; $this->document->saveAs($temp_file); //сохранить в временную папку на сервере } else { $temp_file = tempnam(sys_get_temp_dir(), 'PHPWord');//сохранять будем во временную папку $this->document->saveAs($temp_file); //сохранить в временную папку на сервере //заголовки чтобы скачать сразу файл header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT" ); header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" ); header ( "Cache-Control: no-cache, must-revalidate" ); header ( "Pragma: no-cache" ); header ( "Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document" ); header("Content-Disposition: attachment; filename=dogovor_".$data['id_document'].".docx"); readfile($temp_file); unlink($temp_file); } Генерация работает отлично, это видно по тому, что у каждого договора получается уникальный номер. Далее этот номер нужно сохранить в базу, а он зараза упорно отказывается туда записываться. За запись в базу отвечает вот такой код: PHP: $sql = mysql_query("INSERT INTO `DOO_1osnivac` (`naziv_doo`, `prezime`, `ime`, `broj_pasosa`, `pasos_datums`, `fms_pasos`, `adressa_monte`, `ustavni_fond`, `delatnost`, `derjavlanstvo`, `grad`, `id_document`) VALUES ('".$_POST['naziv_doo']."','".$_POST['prezime']."','".$_POST['ime']."','".$_POST['broj_pasosa']."','".$_POST['pasos_datums']."','".$_POST['fms_pasos']."','".$_POST['adressa_monte']."','".$_POST['ustavni_fond']."','".$_POST['delatnost']."','".$_POST['derjavlanstvo']."','".$_POST['grad']."','".$_POST['id_document']."')"); Все параметры вставляются, кроме этого ид_документ. Но, все остальное просто берется из формы, а ид_документ генерируется автоматически, в этом единственное различие. Раз не из формы идет, можно надо не переменную $_POST использовать, а что то другое, в самом конце кода, ответственного за вставку в базу: POST['id_document'].? --- Добавлено --- Да, во в таблице используется тип: text - во всех строках.
@kordiks1972 Я же попросил чтобы ты скинул, таблицу эту, мы посмотрим на твои поля, тут нету магов, чтобы узнать что ж у тебя за поле такое) И если это автоматическая нумерация файла, это и есть первичный ключ. Поставь ему AutoIncrement как подсказали тебе выше. В самой базе посмотри внимательно и найдешь его. Дерзай.
Понял, вот она. http://prntscr.com/f0b4f0 Поставь ему AutoIncrement как подсказали тебе выше. Пытался, база ругается: http://prntscr.com/f0b5dg Какой тип поля можно выбрать для этого? П.С. Это автоматически генерируемый номер документа, но, это не id, строк которые база сама проставляет по порядку, от 1 до беконечности.
Ещё раз - бред не пиши @kordiks1972, ответь на вопрос: Хотя, по тексту, вроде бы второе. Тогда должен быть просто integer какой-нибудь, без всякого там автоинкремента. Тогда надо делать отладку. Выведи запрос, который у тебя формируется, и попробуй руками исполнить в phpmyadmin. Коли ругнётся, будет ясно, что не так. P.S. а с устаревшего расширения mysql надо слезать. Уже 4 года назад им пользоваться строго не рекомендовалось
Int пробовал ставить, он вместо вот такого номера 58fe6444d53f0 вставляет цифру 0, при чем каждый раз ноль. id_document - это первичный ключ? Или внешний? Не знаю в чем разница, постарался объяснить как мог, что скрипт его сам формирует, т.е., пользователем он не вводится. Т.е., по отношению к скрипту первичный, так как создается "внутри" скрипта, если по отношению к базе внешний. Тогда надо делать отладку. Выведи запрос, который у тебя формируется, и попробуй руками исполнить в phpmyadmin. Вы имеете в виду зайти в пшпадмин, выбрать таблицу - вставить - вставить значение в строку? Да, я это уже делал вставляет без проблем. Если речь о запросе по шаблону, увы ни разу их не делал, попробовал сейчас, и что то не то задал. А вот SQL запрос выполнить смог, вот такой: PHP: INSERT INTO `DOO_1osnivac` (`id`, `naziv_doo`, `prezime`, `ime`, `broj_pasosa`, `pasos_datums`, `fms_pasos`, `adressa_monte`, `ustavni_fond`, `delatnost`, `derjavlanstvo`, `grad`, `id_document`) VALUES (NULL, '', '', '', '', '', '', '', '', '', '', '', '345332'); Проставляются заданные в запросе циферки в ид_документ. Я думаю, что дело не в таблице, а в моем коде php, где то там что то не правильно.
П.С. И из формы передается, если убрать переменную пост и вот так оставить "','".вавадловаролыд123."')"); Но, вот именно то, что нужно не передается.
Два часа помучился, так и не понял в чем дело. Нашел временное решение, использовать вместо идентификатора не уникально генерируемый номер, а, например, номер паспорта человека, который вводится им самим и в базу успешно проставляется. Но, мне это решение не нравится.
Итак, опытным путем, установленно, что проблема именно в php, что то делать с таблицами не нужно. Я для теста упростил скрипт, так как думал, что может быть проблема именно с =uniqid(); Вот такой скрипт: PHP: <?php $conn = mysql_connect ("localhost", "123", "123"); mysql_select_db("123", $conn); empty($data['ustavni_fond']); $data['id_document'] =uniqid(); //Вставляем данные в базу данных. $sql = mysql_query("INSERT INTO `DOO_1osnivac` (`ustavni_fond`, `id_document`) VALUES ('".$_POST['ustavni_fond']."','".$data['id_document']."')"); ?> Прекрасно все в базу данных записывает, а "полный" скрипт не записывает. Вот полная версия скрипта: PHP: <?php /* Работа с обьектом - Word генерация word документов */ class Word { const VERSION = 1.00; /* ПРИМЕНЕНИЕ: $word=new Word(); $word->generate($data); //решение проблемы с русскими буквами http://kumatoz.ru/novosti/reshenie-problemy-russkix-simvolov-v-phpword-setvalue/ */ public function generate($data=NULL){ //генерация документа по шаблону с переменными if (empty($data['template'])) $template="template1"; $tmp_patch=realpath(__DIR__."/../templates/".$template.".docx");//путь до шаблона if ($tmp_patch==false) {//есть ли файл шаблона на сервере? echo "Шаблон договора не найден."; return false; } $this->document = $this->phpword->loadTemplate($tmp_patch); //открываем шаблон $title="Osnivanje DOO"; $subject="Osnivanje DOO"; $description="Osnivanje DOO"; $this->properties = $this->phpword->getDocInfo(); $this->properties->setCreator($_SERVER['HTTP_HOST']); $this->properties->setCompany($_SERVER['HTTP_HOST']); $this->properties->setTitle($this->rus2translit($title)); $this->properties->setDescription($this->rus2translit($description)); $this->properties->setLastModifiedBy($_SERVER['HTTP_HOST']); $this->properties->setCreated(time()); //time() $this->properties->setModified(time()); $this->properties->setSubject($this->rus2translit($subject)); //получаем переменные для подстановки в шаблон // в шаблоне - docx файле должны быть переменные вида ${fio} причем важно чтобы они вставлялись // одним элементом, т.е. без пробелов и лучше просто скопировать отсюда и вставить. // потому что если по частям сохранять эту пременную она может смешаться с тегами //вычисляемые поля empty($data['naziv_doo']); empty($data['prezime']); empty($data['ime']); empty($data['broj_pasosa']); empty($data['pasos_datums']); empty($data['fms_pasos']); empty($data['adressa_monte']); empty($data['ustavni_fond']); //поле select $data['delatnost'] = $_POST['delatnost']; empty($data['delatnost']); $data['derjavlanstvo'] = $_POST['derjavlanstvo']; empty($data['derjavlanstvo']); $data['grad'] = $_POST['grad']; empty($data['grad']); $data['created'] =date("d.m.Y")." года"; $data['id_document'] =uniqid(); //заменяем переменные foreach($data as $field=>$value) $this->document->setValue($field, $value); if (!empty($data['server'])) { $temp_file="finish/dogovor_".$data['id_document'].".docx"; $this->document->saveAs($temp_file); //сохранить в временную папку на сервере } else { $temp_file = tempnam(sys_get_temp_dir(), 'PHPWord');//сохранять будем во временную папку $this->document->saveAs($temp_file); //сохранить в временную папку на сервере //заголовки чтобы скачать сразу файл header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT" ); header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" ); header ( "Cache-Control: no-cache, must-revalidate" ); header ( "Pragma: no-cache" ); header ( "Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document" ); header("Content-Disposition: attachment; filename=dogovor_".$data['id_document'].".docx"); readfile($temp_file); unlink($temp_file); } } private function rus2translit($string){ //перевод русского текста в транслит $converter = array( 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => "'", 'ы' => 'y', 'ъ' => "'", 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => "'", 'Ы' => 'Y', 'Ъ' => "'", 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', ); return strtr($string, $converter); } public function __construct() { //подключаем PHPWord для работы с вордовскими файлами require_once (realpath(__DIR__."/phpword/Autoloader.php")); \PhpOffice\PhpWord\Autoloader::register(); $this->phpword = new \PhpOffice\PhpWord\PhpWord(); } } //class //Вставляем данные в базу данных. $sql = mysql_query("INSERT INTO `DOO_1osnivac` (`naziv_doo`, `prezime`, `ime`, `broj_pasosa`, `pasos_datums`, `fms_pasos`, `adressa_monte`, `ustavni_fond`, `delatnost`, `derjavlanstvo`, `grad`, `id_document`) VALUES ('".$_POST['naziv_doo']."','".$_POST['prezime']."','".$_POST['ime']."','".$_POST['broj_pasosa']."','".$_POST['pasos_datums']."','".$_POST['fms_pasos']."','".$_POST['adressa_monte']."','".$_POST['ustavni_fond']."','".$_POST['delatnost']."','".$_POST['derjavlanstvo']."','".$_POST['grad']."','".$_POST['id_document']."')"); Проблема где то вот с этой переменной (79 строчка), потому, что с ней впоследующем, что только не происходит $data['id_document'] =uniqid(); и к тому моменту, как доходит до вставки в базу, вероятно оказывается, что в этой переменной уже ничего нет. --- Добавлено --- Решить вопрос смог, правда по корсадски, перенес часть кода, ответственного за отправку данных в базу выше, вставил на 80 и 81 строках, и в базу стало записываться корректно.
У вас в sql запросе $_POST, при чем тут $data['id_document'], не могу понять))) если ничего не передают, значит нечего передавать $_POST['id_document']; дебажьте, ну или выше добавьте типа $_POST['id_document'] = (!$_POST['id_document']) ? uniqid() : intval($_POST['id_document']);
Я об этом уже думал, и вместо пост $data['id_document'] и так пробовал и по разному. Посмотрите, потом с этой $data['id_document'] чего только не происходит.
Всех приветствую, вот уже второй день не могу справится с такой задачей, хочу сделать возможность удалять записи с помощью чекбокса, то есть выставляем галочки напротив записи(строки) 2-10 или более, а ниже нажатием на кнопку "Удалить всё" они удаляются. Таблица берется из базы данных, по одной записи удаляется легко, а с чекбоксом проблемы, всё прописал, выделяю несколько строк, нажимаю на кнопку, страница перезагружается, но записи не удаляются. Прошу помощи, предоставляю код ниже: PHP: <?php // соединение с базой данных require_once 'connect.php'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <title>Таблица</title> <meta content="text/html; charset=windows-1251" http-equiv="Content-Type" /> <title>Таблица 2000 строк с фильтрацией</title> <link rel='stylesheet' href='classes.css' type='text/css'> <link rel='stylesheet' href='tabsort1.css' type='text/css'> <script type='text/javascript'>var d0 = new Date()</script> <script type='text/javascript' src='tabtools1.js'></script> <script type='text/javascript' src='tabsort1.js'></script> </head> <?php // Отображаем результаты echo '<p>Таблицы, имеющиеся в базе данных: </p>'; echo "<table class='sortable' id='t' border=1 >"; echo "<col class='id'><col class='name'><col class='width'><col class='profile'><col class='radius'><col class='price'><col class='prices'><col class='sellers'><col class='season'><col class='status'>"; echo "<thead>"; echo "<tr>"; echo "<th axis='num'>ID </th>"; echo "<th>Улица </th>"; echo "<th axis='num:alt'>Width </th>"; echo "<th axis='num:alt'>Квартира </th>"; echo "<th axis='num:alt'>Radius </th>"; echo "<th axis='num'>Price </th>"; echo "<th>Prices </th>"; echo "<th axis='num'>Sellers </th>"; echo "<th>Season </th>"; echo "<th axis='num:alt'>Status </th>"; echo "</tr>"; echo "</thead>"; //Удаляем, если что if (isset($_GET['del'])) { $result = mysql_query('DELETE FROM `user_profiles` WHERE `ID` = "'.$_GET['del'].'"'); if ($result) { echo "<p>Товар удален.</p>"; } else { echo "<p>Произошла ошибка.</p>"; } } //Получаем данные echo '<form action="'.$_SERVER['PHP_SELF'].'" method="GET">'; $result = mysql_query("SELECT * FROM `user_profiles`") or trigger_error(mysql_error()); while($row = mysql_fetch_array($result)){ foreach($row AS $key => $value) { $row[$key] = stripslashes($value); } echo "<tr>"; echo "<td valign='top'>" .$row['id']. "</td>"; echo "<td axis='num' valign='top'>" .$row['mes']. "</td>"; echo "<td valign='top'>" .$row['dom']. "</td>"; echo "<td valign='top'>" .$row['kvar']. "</td>"; echo "<td valign='top'>" .$row['password']. "</td>"; echo "<td valign='top'>" .$row['phon']. "</td>"; echo "<td valign='top'>" .$row['van1']. "</td>"; echo "<td valign='top'>" .$row['van2']. "</td>"; echo "<td valign='top'><a href=?del={$row['id']}>Delete</a></td> "; echo '<td><input type="checkbox" name="row[]" value="'.$row['id'].'" /></td>'; echo "</tr>"; } echo "</table>"; echo '<input type="submit" name="submitForm" value="Удалить отмеченные" />'; if ( isset ( $_GET['row'] ) ) { $items = array(); foreach( $_GET['row'] as $value ) { if ( ctype_digit($value) ) $items[] = $value; } if ( count($items) > 0 ) { $ids = implode( ',', $items ); $query = 'DELETE FROM items WHERE id IN ('.$ids.')'; mysql_query( $query ); } header( 'Location: '.$_SERVER['PHP_SELF'] ); } ?>
Прилагаю рисунок как выглядит страница от базы данных, а так же адресную строку от кнопки "Удалить отмеченные"