Здравствуйте, я новичок в php, пытаюсь добавить новую запись в таблицу, но к сожалению не получается. Вот что я сделал: 1. Подключил базу PHP: <?php try{ $db=new PDO ("mysql:dbname=request;host=localhost","root","mazahaker", array( PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES UTF8", PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_OBJ, PDO::ATTR_ERRMODE=>TRUE )); }catch(PDOExeception $e){ die ($e->getMessage()); }?> 2. Форму с полями для ввода HTML: <form method="post" action="add.php" class="orgAddform"> <p><span>Добавить организацию</span></p> <input type="text" name="MainID_Ref" placeholder="MainID_Ref"> <input type="text" name="ParentType" placeholder="ParentType"> <input type="text" name="ObjectType" placeholder="ObjectType"> <input type="text" name="Name" placeholder="Name"> <input type="text" name="PrefixKod" placeholder="PrefixKod"> <input type="text" name="FTPServer" placeholder="FTPServer"> <input type="text" name="FTPUser" placeholder="FTPUser"> <input type="text" name="FTPPassword" placeholder="FTPPassword"> <input type="text" name="FTPPath" placeholder="FTPPath"> <input type="text" name="JurnalTemplate" placeholder="JurnalTemplate"> <input type="text" name="UnicStr" placeholder="UnicStr"> <input type="text" name="SendMessageUser" placeholder="SendMessageUser"> <input type="text" name="TName" placeholder="TName"> <input type="text" name="KodODU" placeholder="KodODU"> <input type="text" name="KodKPO" placeholder="KodKPO"> <input type="text" name="FTPPort" placeholder="FTPPort"> <input type="hidden" name="JurnalModification" value="<?php echo date ("Y-m-d H:i:s")?>"> <br/> <br/> <input class="btn" type="submit" name="addOrg" value="Добавить"> </form> 3.И затем я пытаюсь выполнить запрос PHP: <?php if(isset($_POST['addOrg'])) { $MainID_Ref=strip_tags(trim($_POST['MainID_Ref'])); $ParentType=strip_tags(trim($_POST['ParentType'])); $ObjectType=strip_tags(trim($_POST['ObjectType'])); $Name=strip_tags(trim($_POST['Name'])); $PrefixKod=strip_tags(trim($_POST['PrefixKod'])); $FTPServer=strip_tags(trim($_POST['FTPServer'])); $FTPUser=strip_tags(trim($_POST['FTPUser'])); $FTPPassword=strip_tags(trim($_POST['FTPPassword'])); $FTPPath=strip_tags(trim($_POST['FTPPath'])); $JurnalTemplate=strip_tags(trim($_POST['JurnalTemplate'])); $UnicStr=strip_tags(trim($_POST['UnicStr'])); $SendMessageUser=strip_tags(trim($_POST['SendMessageUser'])); $TName=strip_tags(trim($_POST['TName'])); $KodODU=strip_tags(trim($_POST['KodODU'])); $KodKPO=strip_tags(trim($_POST['KodKPO'])); $FTPPort=strip_tags(trim($_POST['FTPPort'])); $JurnalModification=$_POST['JurnalModification']; $sql="INSERT INTO dbdeviceuniversalitem (MainID_Ref,ParentType,ObjectType,Name, PrefixKod,FTPServer,FTPUser,FTPPassword,FTPPath,JurnalTemplate,UnicStr,SendMessageUser,TName, KodODU,KodKPO,FTPPort,JurnalModification) VALUES (' $MainID_Ref','$MainID_Ref','$ObjectType','$Name', '$PrefixKod','$FTPServer','$FTPUser','$FTPPassword', '$FTPPath','$JurnalTemplate','$UnicStr','$SendMessageUser','$TName', '$KodODU','$KodKPO','$FTPPort','$JurnalModification')"; $db->exec($sql); echo "<p class='success'>Новая организация была добавлена!</p>"; }else{ echo 'Запись не была добавлена'; } ?> При нажатии на кнопку "Добавить" появляется надпись, "Новая организация была добавлена!". Но в базу запись не добавляется. Подскажите, в чем моя ошибка?
@mazahaler, для начала Вам следует посмотреть логи ошибок (логи БД в том числе). Возможно там будет подсказка.
@Maputo, я нашел ошибку, она выглядит так: Incorrect integer value: ' 4' for column 'MainID_Ref' at row 1 буд-то бы я каким-то образом ввожу пробел перед 4, но это не так. Из-за чего может такое быть?
Если у Вас так же написано в коде, как и тут в посте, то у Вас там символ переноса строки после кавычки. Перенесите кавычку на другую строку
@Maputo, спасибо, теперь все работает!) @Алекс8, не обращайте внимания, я просто переписываю код с видео
Кстати, еще вопрос, как мне после добавления вывести надпись о успешном добавлении, если я использую редирект, чтобы избежать повторой отправки? Так не работает: PHP: if($db->exec($sql)){ @header("Location: ". $_SERVER["REQUEST_URI"]); echo "<p class='success'>Новая организация была добавлена!</p>"; }
@mazahaler, перед редиректом можно в сессии сохранить какое-нибудь значение, а в скрипте проверять - сохранено оно или нет. Если сохранено - вывести сообщение и удалить из сессии сохраненное значение.
@Maputo, я еще ни разу не использовал сессии, но я попробовал так: Это добавил перед редиректом: PHP: session_start(); if (!isset($_SESSION['flag'])) $_SESSION['flag']=1; И вот такой скрипт: Код (Javascript): <script type="text/javascript"> var flag = <?php echo $_SESSION["flag"] ?>; if (flag==1){ alert('Запись добавлена'); flag=0; } </script> Но так не работает. Подскажите, как это правильно сделать?
Например так: PHP: session_start(); ... if(isset($_SESSION['new_organisation'])) { echo "<p class='success'>Новая организация была добавлена!</p>"; unset($_SESSION['new_organisation']); } ... и в том месте где выполняете запрос: PHP: ... if($db->exec($sql)) { $_SESSION['new_organisation'] = ' '; @header("Location: ". $_SERVER["REQUEST_URI"]); } ...
@Maputo, почему-то не работает, может я что-то не в нужном месте написал? PHP: <?php if(isset($_POST['addOrg'])) { session_start(); $MainID_Ref=strip_tags(trim($_POST['MainID_Ref'])); $ParentType=strip_tags(trim($_POST['ParentType'])); $ObjectType=strip_tags(trim($_POST['ObjectType'])); $Name=strip_tags(trim($_POST['Name'])); $PrefixKod=strip_tags(trim($_POST['PrefixKod'])); $FTPServer=strip_tags(trim($_POST['FTPServer'])); $FTPUser=strip_tags(trim($_POST['FTPUser'])); $FTPPassword=strip_tags(trim($_POST['FTPPassword'])); $FTPPath=strip_tags(trim($_POST['FTPPath'])); $JurnalTemplate=strip_tags(trim($_POST['JurnalTemplate'])); $UnicStr=strip_tags(trim($_POST['UnicStr'])); $SendMessageUser=strip_tags(trim($_POST['SendMessageUser'])); $TName=strip_tags(trim($_POST['TName'])); $KodODU=strip_tags(trim($_POST['KodODU'])); $KodKPO=strip_tags(trim($_POST['KodKPO'])); $FTPPort=strip_tags(trim($_POST['FTPPort'])); $JurnalModification=$_POST['JurnalModification']; $sql="INSERT INTO dbdeviceuniversalitem (MainID_Ref,ParentType,ObjectType,Name, PrefixKod,FTPServer,FTPUser,FTPPassword,FTPPath,JurnalTemplate,UnicStr,SendMessageUser,TName, KodODU,KodKPO,FTPPort,JurnalModification) VALUES ( '$MainID_Ref','$ParentType','$ObjectType','$Name', '$PrefixKod','$FTPServer','$FTPUser','$FTPPassword', '$FTPPath','$JurnalTemplate','$UnicStr','$SendMessageUser','$TName', '$KodODU','$KodKPO','$FTPPort','$JurnalModification')"; if(isset($_SESSION['new_organisation'])) { echo "<p class='success'>Новая организация была добавлена!</p>"; unset($_SESSION['new_organisation']); } if($db->exec($sql)){ $_SESSION['new_organisation'] = ' '; @header("Location: ". $_SERVER["REQUEST_URI"]); } } ?>
@mazahaler, стартовать сессию лучше в начале скрипта. Внутри Вашего условия работать это не будет, так как этот участок кода работает только при отправке данных, а после смены локации массив $_POST опустошается. То что в строчках с 34 по 38 поставьте до 2й строчки, ну и старт сессии должен быть в самом начале.
Я не советую код с пупком - я помог исправить существующую ошибку. А исправлять то что автор не просит - это никому не нужно. И зачем exit?
затем. зачем выполнять код после header location, если результат никто не увидит? это блин самообман. это работает так: браузер, получив заголовок с location, не показывает полученный документ, а сразу образается к новому адресу.
В данном случае самообман - считать, что этот exit автору очень нужен. Читайте код товарищи - там две фигурные скобочки и больше ничего. И комментарии читайте:
это из разряда "надо ли ходить на выборы, если твой кандидат всё равно не победит" ))) может он потому и не побеждает, что его сторонники такие расслабленные. чувак, если не делать этого ВСЕГДА, наступит день и случится лажа. код изменяется. сейчас это последняя команда, завтра будет не последняя. не надо экономить буквы.
Не согласен, что это надо делать всегда. Это надо делать тогда, когда это действительно необходимо. Еслиб это надо было делать всегда Zend включил бы инструкцию exit в исполнение header при смене локации. P.S.: по логике, да - exit тут не помешал бы. Но что в дальнейшем будет с этим кодом мы не знаем.
не хочешь - не делай. заготавливай грабли. вот слава богу, что не всё на свете zend сделал за нас. потому что примеров дурной услужливости хватает: - register globals, - safe mode, - $_POST, который обычно содержит переменные post, но знает не про все методы, - magic quotes, - auto buffering, - непредсказуемый include_path, - и т.д. всё с благими намерениями…