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


Автор: thomas 27.10.2007, 00:05
Приветствую.
Преамбула.
Студент в вечерней вышке. По "нормальному" учусь писать на .NET(C# VB). В этом семестре должны были изучать ASP.NET. Но вмешались обстоятельства (наш штатный препод замещает заболевшего директора) и нам дали препода-"пацана" - учите мол пока PHP. "Пацан" толком ничего не обьясняет, а дает задания. Мол люди взрослые -  сами разберетесь.

Суть проблемы.
 Задали нам форум написать на PHP.
Сделал три таблицы в БД (форумы, топики, посты). Так вот ни как не могу сделать INSERT поста в таблицу базы. Поле ID в таблице базы -  автонумерация.
На странице сделал несколько нужных форм. По идее из предыдущей страницы должен получить ID топика. Но обновления БД не происходит.
Третий день читаю форум, но так ничего и не нашел. Просмотрел много тем касающихся БД и INSERT. Вроде все делаю правильно. НО ...

Посмотрите код и направте на путь истинный. 
Заранее благодарю.
 
Код

<?
    session_start();
    session_name('vad');
    include('dbconnection.php');
    if(isset($_REQUEST[submit]))
    {
        $title=$_POST[title];
        $text=$_POST[text];
        $auteur=$_POST[auteur];
        define('NOW',time());
        $time = date("Y-m-d H:i:s",NOW);
        $topic=$_GET['id'];
        $result=mysql_query("INSERT INTO tblPosts (PostID, PostTitle ,PostText, PostAuteur, PostDatetime, PostTopicID) VALUES ('','$title','$text','$auteur','$time','$topic')");
        mysql_close();
    }
?>

Код

<table width='780' border='1' align='center'>
                <tr>
                    <td width='180' valign='top'>
                        Bericht van:</br>
                        <input type='text' name='auteur'></br>
                        Bericht titel:</br>
                        <input type='text' name='title'>
                    </td>
                    <td width='600'>
                        <textarea name="text" style="width: 580px; height: 80px;"></textarea>
                    </td>
                </tr>
                <tr>
                    <td>
                    </td>
                    <td>
                        <input type='hidden' name='page' value='3'>
                        <input type='submit' value='Versturen'>
                    </td>
                </tr>
            </table>


Да, соединение с базой есть, топики по форумам показываются, посты в топиках тоже (вносил в ручную через phpmyadmin) 
И после нажатия кнопки "Отослать" никаких сообщений об ошибке не выводиться, а просто переход на главную страницу форума.

ЗЫ прежде чем создавать тему, честно пытался сам найти инфу на форуме и в инете. Не шмог.  smile 

Автор: Vaulter 27.10.2007, 02:44
как обьявлена таблица?
если автоинкремент поле - 
не вставляйте PostID (уберите из запроса вообще)

Автор: thomas 27.10.2007, 08:18
Vaulter, 
Цитата

если автоинкремент поле - 
не вставляйте PostID (уберите из запроса вообще)
 первоначально там его и не было, вставил потом, после штудирования форума. Без него тоже не работало.
Цитата

как обьявлена таблица?
В смысле?
Таблица создана в phpmyadmin на сервере. Все файлы лежат там же.

Автор: HotHead 27.10.2007, 10:47
Во-первых тег <form> пропущен. Он в скрипте есть? Во-вторых думаю, что до mysql дело вообще не дошло, т.к. чтобы отработала конструкция $_REQUEST[submit], надо иметь в форме что-нибудь с атрибутом name="submit".

Если бы я обкатывал эту штуко то:
1) Взял бы таблицу в теги <form method="post"> ... </form>
2) Дал бы кнопке имя: <input type='submit' value='Versturen' name='submit'>
3) Почему на серверной части и $_POST и $_GET? Для избегания путаницы лучше использовать везде $_REQUEST, пока не разберётесь, когда $_POST, а когда $_GET.
4) Перед закрытием базы написал бы проверочку того, как прошёл запрос: echo ($result)?("Запрос прошёл"):("Запрос не прошёл");

Если добавив пункт 4 ничего не увидите, то значит до БД дело и не дошло.

Автор: flashaa 27.10.2007, 19:29
Цитата(thomas @  27.10.2007,  08:18 Найти цитируемый пост)
Цитата

как обьявлена таблица?
В смысле?

В смысле покажите show create table.

Цитата(thomas @  27.10.2007,  00:05 Найти цитируемый пост)
$_REQUEST[submit]

У вас везде написано вот так... Но это же ошибка. Ключ должен быть заключен в кавычки, 
в противном случае PHP расценивает то, что в квадратных скобках как константу.
http://ru2.php.net/manual/ru/language.types.array.php

И вообще форум не такой информационно-содержательный источник, чтобы читать взапой. Лучше потратьте то же время на чтение документации. smile 

Автор: thomas 27.10.2007, 19:48
HotHead, 
Приветствую.
Теги формы не были пропущены, в них была заключена вся таблица на странице.
А имя для submit  я действительно пропустил. 
Заменил POST и GET на  REQUEST. 

В общем пока то, что не получалось решил.

Всем спасибо.


flashaa, 
Цитата

В смысле покажите show create table.
А это что? Таблицу делал ручками прямо на сервере через phpmyadmin.

Цитата

И вообще форум не такой информационно-содержательный источник, чтобы читать взапой. Лучше потратьте то же время на чтение документации. 

Ну прежде чем вопросы задавать, предпочитаю сначала заюзать поиск по форуму. Думаю, так правильнее. А документация, да ЭТО СИЛА, согласен на 153%

Автор: thomas 27.10.2007, 20:30
В принципе проблему решил таким образом.
Код

<?
if(isset($_REQUEST[submit]))
    {
        $title=$_POST[title];
        $text=$_POST[text];
        $auteur=$_POST[auteur];
        define('NOW',time());
        $time = date("Y-m-d H:i:s",NOW);
        $topic=$_POST['id'];
        mysql_query("INSERT INTO tblPosts (PostID, PostTitle ,PostText, PostAuteur, PostDatetime, PostTopicID) VALUES ('','$title','$text','$auteur','$time','$topic')");    
    }
    //tont inhoud van posts op pagina
    $sql="SELECT * FROM tblPosts WHERE PostTopicID = ".$_REQUEST['id']." ORDER BY PostDatetime";
    $result=mysql_query($sql);
?>
<table width='100%' border='0' align='center'>
    <tr>
        <td>
            <table width='780' border='1' align='center'>
                <tr>
                    <td width='180'>
                        Auteur
                    </td>
                    <td width='600'>
                        Bericht
                    </td>
                </tr>
                <?
                while($rows=mysql_fetch_array($result))
                {
                ?>
                    <tr>
                        <td>
                            <? echo $rows['PostAuteur'];?>
                        </td>
                        <td>
                            <? echo $rows['PostText'];?>
                        </td>
                    </tr>
                <?
                }
                ?>
            </table>
        </td>
    </tr>
    <tr>
        <td>    
            <!-- Post voor forum intevullen  -->
            <form action='index.php' method='post'>
                <table width='780' border='1' align='center'>
                    <tr>
                        <td width='180' valign='top'>
                            Bericht van:</br>
                            <input type='text' name='auteur'></br>
                            Bericht titel:</br>
                            <input type='text' name='title'>
                        </td>
                        <td width='600'>
                            <textarea name="text" style="width: 580px; height: 80px;"></textarea>
                        </td>
                    </tr>
                    <tr>
                        <td>
                        </td>
                        <td>
                            <input type='hidden' name='page' value='3'>
                            <input type='hidden' name='id' value='<?= $_REQUEST['id']?>'>
                            <input type='submit' name='submit' value='Versturen'>
                        </td>
                    </tr>
                </table>                
            </form>            
        </td>
    </tr>
</table>


Для общего развития готов принять критику,дополнения и подсказки правильных решений.
Еще раз всем спасибо за помощь.  smile 

Автор: HotHead 27.10.2007, 21:10
flashaa, 
$_REQUEST[submit] - не смертельно, хотя так делать конечно не надо. Если скрипт не найдёт константы с таким именем, то выдаст предупреждение уровня E_NOTICE и продолжит работу так, как будто это строка.

thomas, смотрите что написал flashaa. Гораздо лучше действительно брать ключ в кавычки (' или "). В будущем избавит от кучи неприятностей. Так же как и "<?php" вместо "<?". Не помню как называлась директива (кажется short_open_tag), но если она в php.ini не прописана, то при переносе на новое место вас может ждать такой сюрприз, что ничего работать не будет. Лучше заранее избавить себя от возможных проблем прописывая лишние три символа. 

Ну и по мелочи. В date текущая дата используется по умолчанию, так что можно писать просто $time = date("Y-m-d H:i:s"); В остольном вполне достойно для начала.

Автор: thomas 27.10.2007, 22:05
HotHead, 
 smile  будет исполнено.
Рекомендации правильные и своевременные.


Автор: flashaa 29.10.2007, 17:50
phpmyadmin это только php-оболочка для отправки запросов к серверу БД, поэтому суть не меняется, одни и те же запросы, только в данном случае через удобный интерфейс.
show create table tbl_name;
этот запрос выводит полное описание таблицы, т.е. если более точно - запрос create table для того чтобы  создать таблицу, идентичную tbl_name.
Будут указаны все поля, их типы, аттрибуты, значения по умолчанию, комментарии, ключи таблицы, её движок (ENGINE), кодировка всех текстовых полей и кодировка самой таблицы.
Поскольку все характеристики таблицы видны, эта команда очень полезна для отладки, ну и для тех, кто хочет понять, как была сделана Ваша таблица. Очень полезная команда. 
В phpmyadmin можно запустить любой запрос, введя его во вкладке SQL, хотя вполне вероятно, что подобный вывод для любой таблицы можно получить через интерфейс phpmyadmin.
Код

mysql> show create table proc;

| proc  | CREATE TABLE `proc` (
  `db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `name` char(64) NOT NULL DEFAULT '',
  `type` enum('FUNCTION','PROCEDURE') NOT NULL,
  `specific_name` char(64) NOT NULL DEFAULT '',
  `language` enum('SQL') NOT NULL DEFAULT 'SQL',
  `sql_data_access` enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NOT NULL DEFAULT 'CONTAINS_SQL',
  `is_deterministic` enum('YES','NO') NOT NULL DEFAULT 'NO',
  `security_type` enum('INVOKER','DEFINER') NOT NULL DEFAULT 'DEFINER',
  `param_list` blob NOT NULL,
  `returns` char(64) NOT NULL DEFAULT '',
  `body` longblob NOT NULL,
  `definer` char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR
_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AU
TO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DI
VISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE') NOT NULL DEFAULT '',
  `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  PRIMARY KEY (`db`,`name`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Stored Procedures' |

1 row in set (0.03 sec)

Автор: Flat 28.7.2009, 20:26
народ сильно не бейте я с тем же вопросом...
Код

$sql=mysql_connect($dbhost, $dbuname, $dbpass);
$sqlt=mysql_select_db($dbname);
if($sql)
        echo '';
    else
        die('Ошибка подключения к серверу баз данных');
if($sqlt)
        echo '';
    else
        die('База данных не найдена или отсутствует доступ');


    $sqlz="INSERT INTO users (lvl, login, passw, email) VALUES (0, '$login', '$pass', '$email')" ;
    $sqlr = mysql_query($sqlz,$dbname);
    if(!$sqlr)
    {
        die('Ошибка выполнения запроса') ;
    }
    echo "kuku";



дает ошибку 'Ошибка выполнения запроса'... че тока не пробовал... и яндекс замучил и форум ваш ) и ученики листал ... толи гдето чето проглядел ... толи че..

в базе запись не появляеться

Автор: Ипатьев 28.7.2009, 20:34
Вместо 'Ошибка выполнения запроса' надо писать mysql_error()
Тогда, к нашему удивлдению, мы сможем прочесть, в чем состоит проблема. It's a magic

Автор: Photon 29.7.2009, 03:26
Flat, это что?
Код

$sqlr = mysql_query($sqlz,$dbname);

Как я понимаю, $dbname - это имя базы данных.  Так какого ж оно хрена делает вместо необязательного параметра указатель_на_соединение?  С чего бы при таком раскладе что-то куда-то добавлялось?

Автор: Flat 29.7.2009, 04:53
Цитата(Photon @  29.7.2009,  03:26 Найти цитируемый пост)
код PHP1:$sqlr = mysql_query($sqlz,$dbname);highlightSyntax('php_2Y4ODA','php');Как я понимаю, $dbname - это имя базы данных.  Так какого ж оно хрена делает вместо необязательного параметра указатель_на_соединение?  С чего бы при таком раскладе что-то куда-то добавлялось?



Спасибо... насчет не обязательности как то странно... без него не работало, хотя селект есть.
установил правильный указатель и все получилось 

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