Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Проблема с insert


Автор: andro_id 24.4.2007, 11:15
Здравствуйте. Я новичок в PHP-программировани. Есть задача:
1. выбор из дроп-даун меню определенного значения, все возможные значения достаются из БД
Код

<form method="post" action="<?php echo $PHP_SELF; ?>">
<input type="hidden" name="action">
<select name="device_explain" onchange="this.form.submit();">
echo "<option>---< Выберите тип >---</option>" ;
<?php
    include "./common_db.inc";
    $link_id = db_connect($default_dbname);
    
    $devices_query = "SELECT device_explain FROM $devices_tablename";
          $devices = mysql_query($devices_query);
           while($query_data = mysql_fetch_array($devices)) {
            $device_explain = $query_data["device_explain"];
              echo "<option>$device_explain</option>" ;     
           }
?>
</select>
</form><br><br><br>


2. В зависимости от выбранного значения, вставка в страницу соответствующей формы

Код

<?php     
   $devices_query = "SELECT device_type FROM $devices_tablename WHERE device_explain='" . $_POST['device_explain'] . "'";
         $devices = mysql_query($devices_query);
           while($query_data = mysql_fetch_array($devices)) {
            $device_type = $query_data["device_type"];                
       }
    if ($device_type == "workstation") {
        //echo "Форма для РАБОЧЕЙ СТАНЦИИ";        
        include('includes/forms/workstation.php');        
    } 


Сама форма:

Код

<center><h3>Добавить оборудование:</h3></center>
<form method="post" action="<?php echo $PHP_SELF; ?>">
<input type="hidden" name="action">
  <div align="center"><center><table border="1" width="90%">
    
    <tr>
      <th width="30%" nowrap>Модель устройства</th>
      <td width="70%"><input type="text" name="device_model" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>Серийный номер</th>
      <td width="70%"><input type="text" name="device_serial" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>Сетевое имя</th>
      <td width="70%"><input type="text" name="device_netname" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>IP адрес</th>
      <td width="70%"><input type="text" name="device_ip" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>MAC адрес</th>
      <td width="70%"><input type="text" name="device_mac" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>Место установки</th>
      <td width="70%"><input type="text" name="device_location" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>Дата получения</th>
      <td width="70%"><input type="text" name="device_date_receive" size="20">&nbsp; формат даты: YYYY-MM-DD</td>
    </tr>
    <tr>
      <th width="30%" nowrap>Дата списания</th>
      <td width="70%"><input type="text" name="device_date_spisan" size="20">&nbsp; формат даты: YYYY-MM-DD</td>
    </tr>
    <tr>
      <th width="30%" nowrap>Комментарий</th>
      <td width="70%"><input type="text" name="device_comment" size="20"></td>
    </tr>
    <tr>
      <th width="30%" colspan="2" nowrap>
        <input type="submit" name="do" value="Добавить">
        <input type="reset" value="Сбросить"></th>
    </tr>
</table>
  </center></div>
</form>
<?php
 
//Вставляет данные в базу
    
    $device_type = $_POST['device_explain'];
    $device_model = $_POST['device_model'];
    $device_netname = $_POST['device_netname'];
    $device_serial = $_POST['device_serial'];
    $device_ip = $_POST['device_ip'];
    $device_mac = $_POST['device_mac'];
    $device_date_receive = $_POST['device_date_receive'];
    $device_comment = $_POST['device_comment'];
    $device_location = $_POST['device_location'];
    $device_status = $_POST['device_status'];
    $device_date_spisan = $_POST['device_date_spisan'];
    
    global $default_dbname, $inventory_tablename;
    $link_id = db_connect($default_dbname);
        
//(`device_id` , `device_type` , `device_model` , `device_netname` , `device_serial` , `device_eklznum` , `device_fiscdate` , `device_servipass` , `device_ip` , `device_mac` , `device_date_receive` , `device_comment` , `device_location` , `device_status` , `device_date_spisan`)    
    
    if (isset($_POST['do'])) {
    $query = "INSERT $inventory_tablename VALUES('', '$device_type', '$device_model', '$device_netname', '$device_serial', '', '', '', '$device_ip', '$device_mac', '$device_date_receive', '$device_comment', '$device_location', '$device_status', '$device_date_spisan')";     
    $result = mysql_query($query);    
    }    
?>


Однако, почему-то, добавление значений в базу не происходит, а только исчезает форма. Если убрать условие if (isset($_POST['do'])), тогда данны добавляются и по нажатию кнопки в форме и по выбору значения onchange="this.form.submit();" в первой форме.
Вопрос:
Как же сделать добавление ТОЛЬКО по нажатию кнопки в форме?
Сделать так, чтобы после добавления значений в базу форма не исчезала, а лишь очищалась? Т.е. нужно чтобы формы не было только при первом посещении страницы, а потом висела та форма, которая последний раз была выбрана.
База:
Код

-----------------------------------
CREATE TABLE  `lmadmin`.`devices` (
  `device_id` int(3) NOT NULL auto_increment,
  `device_explain` varchar(255) NOT NULL default '' COMMENT 'расшифровка',
  `device_img` varchar(45) NOT NULL default '' COMMENT 'изображение',
  `device_type` varchar(45) NOT NULL default '' COMMENT 'тип',
  PRIMARY KEY  USING BTREE (`device_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Типы оборудования';
-----------------------------------
CREATE TABLE  `lmadmin`.`inventory` (
  `device_id` int(11) NOT NULL auto_increment COMMENT 'инвентарный номер',
  `device_type` varchar(64) NOT NULL default '' COMMENT 'тип устройства',
  `device_model` varchar(64) NOT NULL default '' COMMENT 'модель',
  `device_netname` varchar(64) NOT NULL default '' COMMENT 'сетевое имя',
  `device_serial` varchar(64) NOT NULL default '' COMMENT 'серийный номер',
  `device_eklznum` int(11) NOT NULL default '0' COMMENT 'номер ЭКЛЗ',
  `device_fiscdate` date NOT NULL default '0000-00-00' COMMENT 'дата фискализации',
  `device_servipass` text NOT NULL COMMENT 'пароль сервисного инженера',
  `device_ip` varchar(64) NOT NULL default '0' COMMENT 'IP адрес',
  `device_mac` varchar(64) NOT NULL default '0' COMMENT 'MAC адрес',
  `device_date_receive` date NOT NULL default '0000-00-00' COMMENT 'дата получения оборудования',
  `device_comment` varchar(255) NOT NULL default '' COMMENT 'комментарии',
  `device_location` varchar(255) NOT NULL default '' COMMENT 'месторасположение',
  `device_status` int(11) default NULL,
  `device_date_spisan` date NOT NULL default '0000-00-00' COMMENT 'дата списания',
  PRIMARY KEY  USING BTREE (`device_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 COMMENT='инвентаризация';
-----------------------------------
Спасибо.

Автор: PARROT 24.4.2007, 11:33
andro_id, какие ошибки пишет?

Автор: andro_id 24.4.2007, 11:39
никаких ошибок. если стоит условие, после нажатия кнопки "Добавить" форма просто сбрасывается и на странице выводится только первый селект. Хотя я ставил проверку того, что передаётся в $_POST, все данные проходят, но мимо базы.

Автор: PARROT 24.4.2007, 11:54
Цитата(andro_id @  24.4.2007,  12:39 Найти цитируемый пост)
никаких ошибок.

Такого не бывает:
Код

$devices = mysql_query($devices_query) or die(mysql_error());


Автор: andro_id 24.4.2007, 12:07
Получаю Resource id #5 и никаких ошибок. А как сделать, чтобы форма не пропадала, а оставалась, но чистая? Сейчас после нажатия на кнопку Добавить происходит возврат к первому селекту, а формы нет. Чтобы форма снова появилась, нужно опять выбрать значение. Может тогда будет проще найти проблему?

Автор: PARROT 24.4.2007, 12:20
http://www.mysql.ru/docs/man/Retrieving_data.html

Добавлено через 4 минуты и 15 секунд
http://www.mysql.ru/docs/man/SELECT.html

Добавлено через 6 минут и 33 секунды
http://ru.php.net/manual/ru/function.mysql-fetch-array.php 

http://ru.php.net/manual/ru/function.mysql-fetch-assoc.php

Автор: andro_id 24.4.2007, 12:28
Я знаю как происходит выборка из БД. Отбросим пока вопрос с БД. Как сделать, чтобы форма висела всегда, кроме первого захода на страницу?

Автор: PARROT 24.4.2007, 12:28
Если Вы обращаетесь по индексу поля, то Вам следует использовать 
mysql_fetch_assoc --  Обрабатывает ряд результата запроса и возвращает ассоциативный массив.

Добавлено через 5 минут и 10 секунд
У Вас форма зависит от выбора из базы. А если из базы ничего не приходит, то и формы не будет.  Разберитесь с базой, печатайте запросы и смотрите что за данные к вам приходят. 
Код

echo "SELECT device_type FROM $devices_tablename WHERE device_explain='" . $_POST['device_explain'] . "'";

Автор: andro_id 24.4.2007, 12:40
После первого выбора значения в селекте я получаю соответсвующую форму. Т.е. переменная уже получена. Можно ли сохранить её и "протащить" через форму для заполнения по второму кругу? Чтобы если в первом селекте ничего не выбиралось, то осталась предыдущая форма. Или в данной реализации это невозможно и нужно придумывать что-то другое?

Автор: PARROT 24.4.2007, 12:48
Думаю надо написать план действий, чтобы было понятно.

Добавлено через 2 минуты и 54 секунды
По пунктам.

Автор: andro_id 24.4.2007, 12:58
Итак, план:
1. Первый заход - видим только первый селект, в котором выбираем тип оборудования
 --> выбрали(есть переменная $var, по которой) --> получам соответствующую форму
2. Заполняем форму(переменную $var держим в уме)
--> жмаем Добавить --> данные ушли в базу(переменную $var держим в уме)
3. Возврат к началу страницы и т.к. переменная $var уже есть, открываем соответствующую форму.

Т.е. избавляем пользователя от повторного выбора типа оборудования и вывода соответсвующей формы. Если нужно добавить 100 шт. однотипного оборудования, зачем каждый раз снова выбирать одну и ту же форму? Вот такая задумка.

Автор: GZep 24.4.2007, 13:00
а после записи в бд редирект делаете?

Автор: PARROT 24.4.2007, 13:06
Код

       if ($var=="") $form="Форма не выбрана";
else $form = "даем форму";


Автор: andro_id 24.4.2007, 13:06
Цитата

а после записи в бд редирект делаете? 

Вот тут поподробнее. Редирект не делаю, см. первый пост. Всё заканчивается этим
Код

if (isset($_POST['do'])) {
    $query = "INSERT $inventory_tablename VALUES('', '$device_type', '$device_model', '$device_netname', '$device_serial', '', '', '', '$device_ip', '$device_mac', '$device_date_receive', '$device_comment', '$device_location', '$device_status', '$device_date_spisan')";     
    $result = mysql_query($query);    
    }   

Как сделать?

Автор: andro_id 24.4.2007, 13:38
Цитата

 if ($var=="") $form="Форма не выбрана";
else $form = "даем форму";

Эта переменная $var не переносится из формы, которая вставляется инклудом, обратно в родительский php-файл. Т.е. сбой на этом этапе:
2. Заполняем форму(переменную $var держим в уме)
--> жмаем Добавить --> данные ушли в базу(а переменная $var пропала)
3. Возврат к началу страницы и переменной $var уже нет --> $form="Форма не выбрана".
Как быть?
Если точнее: Как же пронести переменные из дочерней формы, обратно в родительский файл?


Автор: PARROT 24.4.2007, 13:41
http://ru.php.net/manual/ru/function.header.php

Автор: andro_id 24.4.2007, 13:52
А зачем редирект, ведь переход и так происходит?

Добавлено через 5 минут и 15 секунд
Так всё-таки, можно пронести переменную, если да, то как? Если нет, "будем искать"  smile 

Автор: PARROT 24.4.2007, 14:26
Сделать ее глобальной.

Добавлено через 1 минуту и 33 секунды
Код

$GLOBALS['var']=1;

Автор: andro_id 24.4.2007, 15:41
Не, не получается, видимо придётся решать с помощью JavaScript, в которой я ещё бОльший "0". smile 

Автор: capitan 24.4.2007, 17:36
Цитата

Хотя я ставил проверку того, что передаётся в $_POST, все данные проходят.

Каким образом? Посмотри что передаётся в $_POST  так var_dump($_POST);
есть ли в массиве переменная "do" ?

Автор: andro_id 24.4.2007, 17:42
Да. передаётся.

array(11) { ["action"]=>  string(0) "" ["device_model"]=>  string(0) "" ["device_serial"]=>  string(0) "" ["device_netname"]=>  string(0) "" ["device_ip"]=>  string(0) "" ["device_mac"]=>  string(0) "" ["device_location"]=>  string(0) "" ["device_date_receive"]=>  string(0) "" ["device_date_spisan"]=>  string(0) "" ["device_comment"]=>  string(0) "" ["do"]=>  string(8) "Добавить" }

Автор: capitan 24.4.2007, 17:49
Попробуй так :
Код

<tr>
      <th width="30%" colspan="2" nowrap>
        <input type="hidden" name="insert_base" value="add_base">
        <input type="submit" name="do" value="Добавить">
        <input type="reset" value="Сбросить"></th>
    </tr>

И делай проверку не if (isset($_POST['do'])) , a
Код

if($_POST['insert_base']=="add_base") {
    $query = "INSERT $inventory_tablename VALUES('', '$device_type', '$device_model', '$device_netname', '$device_serial', '', '', '', '$device_ip', '$device_mac', '$device_date_receive', '$device_comment', '$device_location', '$device_status', '$device_date_spisan')";     
    $result = mysql_query($query);    
}    

Автор: andro_id 24.4.2007, 17:59
Неа, не хочет. А если условие убрать вообще, тогда добавляется и по кнопке и по селекту. Я уже башку сломал  smile 

Автор: capitan 24.4.2007, 18:03
сделай так:
Код

if($_POST['insert_base']=="add_base") {
   var_dump($_POST);
}   


Выведутся данные?

Автор: andro_id 24.4.2007, 18:08
Нет.
Вот массив:
Код

array(12) { ["action"]=>  string(0) "" ["device_model"]=>  string(0) "" ["device_serial"]=>  string(0) "" ["device_netname"]=>  string(0) "" ["device_ip"]=>  string(0) "" ["device_mac"]=>  string(0) "" ["device_location"]=>  string(0) "" ["device_date_receive"]=>  string(0) "" ["device_date_spisan"]=>  string(0) "" ["device_comment"]=>  string(0) "" ["insert_base"]=>  string(8) "add_base" ["do"]=>  string(8) "Добавить" }

Автор: capitan 24.4.2007, 18:20
А вообще, эти куски кода в одном файле находятся?

Автор: andro_id 24.4.2007, 18:31
Вот-вот.
Код

if (isset($_POST['do'])) {
    $query = "INSERT $inventory_tablename VALUES('', '$device_type', '$device_model', '$device_netname', '$device_serial', '', '', '', '$device_ip', '$device_mac', '$device_date_receive', '$device_comment', '$device_location', '$device_status', '$device_date_spisan')";
    $result = mysql_query($query);
    } 

Этот код идёт в дочернем файле с формой worcstation.php, которая подключается из родительского файла index.php.
Если перенести его в самое начало родительского файла, тогда всё работает правильно. Т.е. всё, что сидит в var_dump($_POST) попадает в родительский файл и добавляется в базу.

Автор: capitan 24.4.2007, 18:33
Так с этого и нужно было начинать.
Выложи ещё раз код, пофайлово.

Автор: andro_id 24.4.2007, 18:37
index.php
Код

<?php
include "./common_db.inc";
$link_id = db_connect($default_dbname);
if (isset($_POST['do'])) {
    $query = "INSERT $inventory_tablename VALUES('', '$device_type', '$device_model', '$device_netname', '$device_serial', '', '', '', '$device_ip', '$device_mac', '$device_date_receive', '$device_comment', '$device_location', '$device_status', '$device_date_spisan')";
    $result = mysql_query($query);
    } 
?>    
<form method="post" action="<?php echo $PHP_SELF; ?>">
<input type="hidden" name="action">
<select name="device_explain" onchange="this.form.submit();">
echo "<option>---< Выберите тип >---</option>" ;
<?php
$devices_query = "SELECT device_explain FROM $devices_tablename";
$devices = mysql_query($devices_query);
while($query_data = mysql_fetch_array($devices)) {
    $device_explain = $query_data["device_explain"];
    echo "<option>$device_explain</option>" ;
    }
?>
</select>
</form><br><br><br>

<?php
$devices_query = "SELECT device_type FROM $devices_tablename WHERE device_explain='" . $_POST['device_explain'] . "'";
$devices = mysql_query($devices_query);
while($query_data = mysql_fetch_array($devices)) {
    $device_type = $query_data["device_type"];
    }
    if ($device_type == "workstation") {
        include('workstation.php');
        }     
?>


workstation.php
Код

<center><h3>Добавить оборудование:</h3></center>
<form method="post">
<input type="hidden" name="action">
  <div align="center"><center><table border="1" width="90%">
    
    <tr>
      <th width="30%" nowrap>Модель устройства</th>
      <td width="70%"><input type="text" name="device_model" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>Серийный номер</th>
      <td width="70%"><input type="text" name="device_serial" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>Сетевое имя</th>
      <td width="70%"><input type="text" name="device_netname" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>IP адрес</th>
      <td width="70%"><input type="text" name="device_ip" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>MAC адрес</th>
      <td width="70%"><input type="text" name="device_mac" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>Место установки</th>
      <td width="70%"><input type="text" name="device_location" size="20"></td>
    </tr>
    <tr>
      <th width="30%" nowrap>Дата получения</th>
      <td width="70%"><input type="text" name="device_date_receive" size="20">&nbsp; формат даты: YYYY-MM-DD</td>
    </tr>
    <tr>
      <th width="30%" nowrap>Дата списания</th>
      <td width="70%"><input type="text" name="device_date_spisan" size="20">&nbsp; формат даты: YYYY-MM-DD</td>
    </tr>
    <tr>
      <th width="30%" nowrap>Комментарий</th>
      <td width="70%"><input type="text" name="device_comment" size="20"></td>
    </tr>
    <tr>
      <th width="30%" colspan="2" nowrap>
        <input type="submit" name="do" value="Добавить">
        <input type="reset" value="Сбросить"></th>
    </tr>
</table>
  </center></div>
</form>
<?php    
$device_type = $_POST['device_explain'];
$device_model = $_POST['device_model'];
$device_netname = $_POST['device_netname'];
$device_serial = $_POST['device_serial'];
$device_ip = $_POST['device_ip'];
$device_mac = $_POST['device_mac'];
$device_date_receive = $_POST['device_date_receive'];
$device_comment = $_POST['device_comment'];
$device_location = $_POST['device_location'];
$device_status = $_POST['device_status'];
$device_date_spisan = $_POST['device_date_spisan'];
?>


Вот.

Автор: capitan 24.4.2007, 18:42
в файле workstation.php у формы пропиши action 
Код

<form method="post" action="index.php">


и я бы сделал всё таки так:
Цитата

Попробуй так :
Код

<tr>
      <th width="30%" colspan="2" nowrap>
        <input type="hidden" name="insert_base" value="add_base">
        <input type="submit" name="do" value="Добавить">
        <input type="reset" value="Сбросить"></th>
    </tr>

И делай проверку не if (isset($_POST['do'])) , a
Код

if($_POST['insert_base']=="add_base") {
    $query = "INSERT $inventory_tablename VALUES('', '$device_type', '$device_model', '$device_netname', '$device_serial', '', '', '', '$device_ip', '$device_mac', '$device_date_receive', '$device_comment', '$device_location', '$device_status', '$device_date_spisan')";     
    $result = mysql_query($query);    
}    



Автор: andro_id 24.4.2007, 18:52
Спасибо за помощь.
Почему так лучше?

Автор: capitan 24.4.2007, 18:55
Цитата(andro_id @ 24.4.2007,  18:52)
Спасибо за помощь.
Почему так лучше?

Это просто моё мнение smile  Так всё заработало или нет ещё? Вопрос закрыт?

Автор: andro_id 24.4.2007, 19:27
Да, всё заработало. Ура. Целый день бился. Всё-таки клссная вещь этот PHP. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)