|
 1.6 Кб |
|
| Здавствуйте уважаемые форумчане и мастера PHP
У меня такая проблема вот уже несколько дней я не могу понять где ошибка? может я что-то напутал, а может это глюк php или mysql
Коротко о проблеме:
1 - Есть два файла. Один форма из админки для добавления статьи, а второй соответственно - экшен (обработчик). Так вот, при передачи данных через обработчик в базу данных заносится вся информация как и должно быть, но данные занесенные в последнее поле оказываются продублированными в первом поле после идентификатора.
2 - Код проверять уже устал вроде бы никаких ошибок нет, но тем неменее творится что-то аномальное. Даж винду уже переустановил, но проблема не исчезла. Кто нибудь сталкивался с подобным явлением? Напишите пожалуйста мне ответ в этот топик, в личку или на мое мыло fastcom2@yandex.ru
Заранее благодарю.
Исходники прилагаю в архие все файлы с расширением .php | |
|
|
|
|
|
|
|
для: Blacksergey
(14.01.2009 в 00:03)
| | код далек от совершенства, но означенных ошибок не содержит.
Как Вы наблюдаете это дублирование?
Если собственным скриптом - нужно смотреть его текст.
Если в phpMyAdmin (или аналогичном средстве работы с БД) - попробуйте заново создать таблицу (или даже базу) . Похоже проблема в ней. | |
|
|
|
|
|
|
|
для: Trianon
(14.01.2009 в 00:20)
| | >код далек от совершенства, но означенных ошибок не содержит.
>Как Вы наблюдаете это дублирование?
>Если собственным скриптом - нужно смотреть его текст.
>Если в phpMyAdmin (или аналогичном средстве работы с БД) - попробуйте заново создать таблицу (или даже базу) . Похоже проблема в ней.
Да, я проверяю результат двумя способами: 1-напрямую через phpmyadmin 2-через браузер путем запроса к базе и выводы статей в цикле do (while)
В том то и дело, что после переустановки винды и установленного заново денвера, я заново создал базу данных с таким же именем, как и в коде, чтобы не переписывать запросы мускула к базе и таблицы были созданы заново, но с теми же именами, чтобы не перекраивать код. Ведь я думаю, что имя таблицы здесь роли ни какой не играет.
Ну что же делать. Да, кстати, в процессе редактирования статей из формы в базу первый раз заносятся данные с таким же глюком, а после повторного редактирования этой же статьи все заносится нормально.
Вот то то и странно.
Мож посоветуете что?
Я уже устал эксперементировать и искать место моей ошибки которой как получается и нет вовсе!!! | |
|
|
|
|
|
|
|
для: Blacksergey
(14.01.2009 в 00:48)
| | >Мож посоветуете что?
>>Если в phpMyAdmin (или аналогичном средстве работы с БД) - попробуйте заново создать таблицу (или даже базу) . Похоже проблема в ней. | |
|
|
|
|
|
|
|
для: Trianon
(14.01.2009 в 01:07)
| | >>Мож посоветуете что?
>>>Если в phpMyAdmin (или аналогичном средстве работы с БД) - попробуйте заново создать таблицу (или даже базу) . Похоже проблема в ней.
Только что пробовал создать заново таблицу - без результата. Пробовал создать новую базу и заново таблицы - тож эффекта никакого! ????
Что же это может так и на удаленном сервере глючить?
Мож другую версию денвера скачать? а даст ли это что нибудь?
Навсякий случай: Я использую win Xp Sp3 с обновлениями за декабрь 2008 года. | |
|
|
|
|
|
|
|
для: Blacksergey
(14.01.2009 в 01:24)
| | А конкретней... имена полей... что и куда дублируется... | |
|
|
|
|
|
|
|
для: serjinio
(14.01.2009 в 09:10)
| | >А конкретней... имена полей... что и куда дублируется...
1-е поле "id",2-е поле "title",3-е поле "meta_d",4-е поле "meta_k",5е -поле "date",6-е поле "description", 7-е поле "text", 8-е поле "author"
Так вот в базу заносится все верно, но данные занесенные в последнее поле - автора и почему-то данные из этой переменной заносятся в базу в поле "title"
И такое ощущение, что внесение из переменных происходит последовательно в том порядке, в котором они отмечены в "VALUES", а потом при занесении данных из последней переменной - данные в поле "title" замещаются данными из $author.
Пробовал убирать данные из первого поля формы, или совсем удалял это поле, то, так как в коде сделана проверка на заполнение всех полей, то естественно выдается сообщение об ошибке и в базу записи не происходит.
А в самом начале топика я прилагаю в архиве два php файла: форма и обработчик. | |
|
|
|
|
|
|
|
для: Blacksergey
(14.01.2009 в 10:28)
| | Не стоит в условиях проверки пользоваться смешаннми операторами, как && наряду с and. Вам нужно упростить все, например:
<?
//инициализация
$title = isset($_POST['title']) ? $_POST['title'] : '';
$meta_d = isset($_POST['meta_d']) ? $_POST['meta_d'] : '';
$meta_k = isset($_POST['meta_k']) ? $_POST['meta_k'] : '';
$date = isset($_POST['date']) ? $_POST['date'] : '';
$description = isset($_POST['description']) ? $_POST['description'] : '';
$text = isset($_POST['text']) ? $_POST['text'] : '';
$author = isset($_POST['author']) ? $_POST['author'] : '';
//....
//проверка и запись
if ($title && $meta_d && $meta_k && $date && $description && $text && $author)
//...
|
PS. В приложенном вами что-то не наблюдается самой формы. | |
|
|
|
|
|
|
|
для: sim5
(14.01.2009 в 11:06)
| | >Не стоит в условиях проверки пользоваться смешаннми операторами, как && наряду с and.
Я понимаю, что не следует мешать дваамперсанты и and, но суть проблемы не в этом. Я пробовал пользоваться однородными операторами - это проблемму не решает
Вам нужно упростить все, например:
>
<?
>//инициализация
>$title = isset($_POST['title']) ? $_POST['title'] : '';
>$meta_d = isset($_POST['meta_d']) ? $_POST['meta_d'] : '';
>$meta_k = isset($_POST['meta_k']) ? $_POST['meta_k'] : '';
>$date = isset($_POST['date']) ? $_POST['date'] : '';
>$description = isset($_POST['description']) ? $_POST['description'] : '';
>$text = isset($_POST['text']) ? $_POST['text'] : '';
>$author = isset($_POST['author']) ? $_POST['author'] : '';
>//....
>//проверка и запись
>if ($title && $meta_d && $meta_k && $date && $description && $text && $author)
>//...
>
|
Да-а-а вам профессионалам хорошо говорить и писать сжатый код, но то, что написано выше для меня мало понятно. без расшифровки.
И если в первую часть я еще как-то врубаюсь
$title = isset($_POST['title'])
|
То вторую я просто не понимаю
Может когда я начну плавать в коде, как рыба в воде, тогда я захочу заняться оптимизацией кода, но пока, на данном этапе моего скудного познания PHP и MYSQL - мне проще писать код, который длиннее, но более понятен и приемлем для меня. Я конечно понимаю, что то, что написано у вас кодом выше - это возможно максимально короткий код для интерпретатора PHP - В любом случае спасибо за пример - но еще раз повторюсь - вторая его часть мне мало о чем говорит
>PS. В приложенном вами что-то не наблюдается самой формы.
А форма в файле new_articles.php и из этой формы передаются данные в экшен - add_articles.php | |
|
|
|
|
|
|
|
для: Blacksergey
(14.01.2009 в 11:36)
| | Это называется условной операцией:
А = варажение В ? выражение С : выражение D
А будет равно С, если удовлетворяет выражению (условию) В, в противном случае А будет равно D.
Нет в вашем архиве файла new_articles.php, да это и не важно. Вот это:
<?
<?php
$title = isset($_POST['title']) ? $_POST['title'] : '';
$meta_d = isset($_POST['meta_d']) ? $_POST['meta_d'] : '';
$meta_k = isset($_POST['meta_k']) ? $_POST['meta_k'] : '';
$description = isset($_POST['description']) ? $_POST['description'] : '';
$text = isset($_POST['text']) ? $_POST['text'] : '';
$author = isset($_POST['author']) ? $_POST['author'] : '';
if ($title && $meta_d && $meta_k && $description && $text && $author) {
$q = "INSERT INTO articles (title,meta_d,meta_k,date,description,text,author)
VALUES ('$title','$meta_d','$meta_k','".date('Y-m-d')."','$description','$text','$author')";
echo $q;
} else echo "NOT";
?>
<form action="" method="post">
<input type="text" name="title"><br>
<input type="text" name="meta_d"><br>
<input type="text" name="meta_k"><br>
<input type="text" name="description"><br>
<textarea cols="" rows="" name="text"></textarea><br>
<input type="text" name="author"><br>
<input type="submit" value="Send">
</form>
|
Производит запись без всяких проблем. (я выбросил из формы поле даты, ее можно получить на сервере). | |
|
|
|
|
|
|
|
для: sim5
(14.01.2009 в 11:49)
| | >Производит запись без всяких проблем. (я выбросил из формы поле даты, ее можно получить на сервере).
Да, действительно - при добавлении в базу в echo выводится 1(хотя в моем случае PHP тоже возвращал "TRUE"). Я нашел проблемное место. оно было в проверке вытаскивания из глобальной переменной и присвоению глобальной - обычной переменной.
То есть я в место своего длинного кода
<?php
if (isset($_POST['title'])) {$title = $_POST['title'];
if ($title == '')
{
unset ($title);
}
}
?>
|
Вставил этот
<?php
$title = isset($_POST['title']) ? $_POST['title'] : '';
$meta_d = isset($_POST['meta_d']) ? $_POST['meta_d'] : '';
$meta_k = isset($_POST['meta_k']) ? $_POST['meta_k'] : '';
$description = isset($_POST['description']) ? $_POST['description'] : '';
$text = isset($_POST['text']) ? $_POST['text'] : '';
$author = isset($_POST['author']) ? $_POST['author'] : '';
?>
|
Все стало добавляться ОТЛИЧНО. ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!! :)
Но опять же возникает встречный вопрос почему такой код вообще преподается если он не срабатывает правильно.?
Может проблема с функцией уничтожения переменной, когда она получает лож? | |
|
|
|
|
|
|
|
для: Blacksergey
(14.01.2009 в 12:30)
| | Вообще-то, в записи выше нет глобальной переменной, если вы говорите о $title. А вот то, что в этой записи нет никакой логики, то это факт. Вы для интереса добавте еще в пример вот это:
print_r($_POST);
и посмотрите что вы получаете из формы. Сами ответите на вопрос, есть ли польза от unset ($title).
Если более грамотно написать ваше, то и он будет работать без проблем. Например, в услови проверки надо проверять не то, что переменная установлена, а то, что является ли ее значение пустым - empty($var). Просто условная операция выглядит более компактно, что дает меньший шанс возникновения ошибки по вине автора кода. Сравните свою "портянку" с записью с помощью условных операций, последнее читать легче.
echo пример вместо записи, это просто проверить то, что будет отдано в базу, дабы можно было увидеть наличие других проблем. | |
|
|
|
|
|
|
|
для: sim5
(14.01.2009 в 12:52)
| | Да, спасибо я практически понял!
Не могли бы вы мне по подробнее расшифровать логику кода приведенного ниже.
<?php
$title = isset($_POST['title']) ? $_POST['title'] : '';
?>
|
Что значит "?" и почему(что значит) ":"
Просто я в свое время купил У Е. Попова видеокурс по php и mysql для начинающих. И там все объясняется так, как вы видели у меня. Но впринципе это первый "косяк" из его видеокурса и думаю, что не последний (Очень жалко). Да и вообще в плане тех. поддержки .... от него не дождешься. Пропал кудато и на связь не выходит и на письма не отвечает. Дай Бог здоровья таким как Вы.
Может еще линки какие нить дадите на доп. литературу в интернете.
Курс то я купил, поскольку покупал и книги по этой теме и литру качал, но по-большей части это формат pdf и отсканено в нем с ошибками.... ну вобщем так-то "чайник" в этом деле, да еще и учебники с ошибками. По видеокурсу заниматься с одной стороны намного легче - еслиб не такие ошибки. Да....
Еще раз Большое Вам Спасибо.
Вопрос закрыт в этом топике. И спасибо всем, кто пытался помоч. | |
|
|
|
|
|
|
|
для: Blacksergey
(14.01.2009 в 13:29)
| | >Не могли бы вы мне по подробнее расшифровать логику кода приведенного ниже.
Есть такая неприятная вещь, как повторная запись в базу, например, при обновлении страницы пользователем по F5. Для того чтобы это исключить, можно всопользоваться эффективным приемом - перенаправлением, которое можно сделать на "саму себя", то есть на ту же страницу, которая и обрабатывает форму.
В этом случае, лучше сразу проиницилизировать переменные, которые будт получать данные полей формы, так как эта же страница предполагает вывод ошибок при вводе пользователем. Если вы не будете возвращать уже введенные пользователем данные, то ему придется их набирать заново. Вот исходя из всего это и нужна инициализация выше. А эта запись будет делать следующее. При первой загрузке страницы условие isset($_POST['title']) не выполняется, так как форма не была передана, поэтому значение перменной $title будет пустым. Если же форма пришла, то значение соответсвующего поля будет присвоено ей.
У вас нет в примере никакой проверки значений полей, но если таковые нужны, то далее вы проверяете значение $title на условия вводимых значений, и если есть несоответствия, то заполяете перменную, например, $error, соответствующим сообщением.
Далее идет вывод формы по умолчанию (первичная загрузка страницы) и при ошибках, а в значения полей формы вставляете инициализированные ранее переменные, для поля title это:
<input type="text" name="title"value="<? echo htmlspecialchars($title) ?>">
|
В этом случае пользователю не придется заново вводить уже введенные ранее данные, когда вы возвращаете форму с ошибками.
Я делаю так, мне удобнее так. Это не значит, что это единственно верное решение, но оно проще вашего из видео курса, и выполняет двоякую роль. Что касается видеокурсов, не знаю, лично я такой ерундой не пользуюсь. А ссылки на учебники - смотрите выше непосредственно на этой странице, там ссылки на книги авторов этого форума. Возможно они вам более будут полезны, чем сомнительные видео уроки. | |
|
|
|
|
|
|
|
для: sim5
(14.01.2009 в 13:52)
| | Спасибо!
На ошибках учатся... Возможно надо было раньше этот язык начать изучать. Но как обычно это бывает, что поздно спахватываешься.. А сейчас в 33 года эта информация усваивается тяжелее. Наверное потому что "Жесткий диск головы переполнен" Да и "оперативка" уже не та :) | |
|
|
|
|