PHP формирует одно из двух обязательных текстовых полей

Я понимаю, что есть похожие темы, касающиеся страниц .asp, однако я использую html-форму с php, связанную с действием отправки, ведущим к опросу.

Клиент, для которого я разрабатываю, хотел бы, чтобы одно из текстовых полей было заполнено, хотя ни одно из них не является обязательным, одно из двух должно быть заполнено. Это может быть любой из двух, однако оба не могут быть оставлены пустыми.

Я бы предпочел не использовать jquery, однако, если это необходимо, я узнаю, как это сделать. Я новичок во всем этом, и простое создание формы и подключение ее к базе данных потребовало много обучения, смеется.

Спасибо за любую помощь, ниже я разместил HTML-форму и php-скрипт, с которым она связана.

<form action="insert.php" method="post">
Name: <input type="varchar" name="name" />
<span style="color: #F00">or</span> Email:
<input type="varchar" name="email" />
<input type="submit" />
</form>

PHP 'insert.php

<?php
$con = mysql_connect("localhost","gobagtoo_1","1");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("gobagtoo_1", $con);

$sql="INSERT INTO name_email (name, email)
VALUES
('$_POST[name]','$_POST[email]')";

if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
else 
$url = 'tool.html';
echo '<META HTTP-EQUIV=Refresh CONTENT="0; URL='.$url.'">';  

mysql_close($con)
?>

M


person Matt Douglas    schedule 19.02.2012    source источник
comment
Обязательно избегайте имени/адреса электронной почты, чтобы предотвратить инъекцию.   -  person John V.    schedule 19.02.2012
comment
Varchar не является допустимым типом элемента ввода формы.   -  person j08691    schedule 19.02.2012
comment
Отправил редактирование для экспертной оценки, удалив его имя хоста БД и информацию о системе.   -  person phpmeh    schedule 19.02.2012
comment
Конечно да. Просто к нему не привязано какое-либо особое поведение, поэтому он ведет себя как "text".   -  person Niet the Dark Absol    schedule 19.02.2012


Ответы (1)


Вы должны выполнить это как на стороне клиента (там, где вы видите форму) с помощью javascript, так и на стороне сервера (PHP после отправки формы).

На стороне клиента: 1. Добавьте на страницу функцию validateForm. 2. Добавьте атрибуты id к своему имени и элементам электронной почты. 3. Добавьте элемент onsubmit в тег формы.

    <html>
    <head>
    <script language="javascript">
    function validateForm(){
        var value1 = document.getElementById('nameId').value;
        var value2 = document.getElementById('emailId').value;
        if( value1 != "" || value2 != "" ) 
        {
            return true;    
        }
        alert("You must enter a value");
        return false;
    }
    </script>
    </head>

    <body>
    <form action="insert.php" method="post" onsubmit="return validateForm();">
    Name: <input type="text" name="name" id="nameId" /> 
    <span style="color: #F00">or</span> Email: <input type="text" name="email" id="emailId" />
    <input type="submit" /> 
    </form> 
    </body>
    </html>

На стороне PHP:

    <?PHP

    function makeSafeish( $value ){
        return mysql_escape_real_string( $value );
        // If you put this in a function, you can do more w/ it. I don't use this as is but don't want to be judged by the community here for my bad use :P
    }

    if( strlen( $_POST['name'] ) > 0 && strlen( $_POST['email'] ) > 0 ){
        $con = mysql_connect("localhost","******","******"); 
        if (!$con) { 
            die('Could not connect: ' . mysql_error()); 
        }  
        mysql_select_db("*****", $con); 
        $sql="INSERT INTO name_email (name, email) VALUES ('".makeSafeish( $_POST["name"] )."','".makeSafeish( $_POST["email"] )."')"; 
        if ( ! mysql_query( $sql, $con ) ) { 
            die('Error: ' . mysql_error()); 
        } else  {
            $url = 'tool.html'; 
        }

        echo '<META HTTP-EQUIV=Refresh CONTENT="0; URL='.$url.'">';    
        mysql_close($con); // you're not gonna get here because of the above line.
    }else{
        echo 'You must enter either an email or name.";
    }
    ?> 
person phpmeh    schedule 19.02.2012
comment
Хороший ответ. Несколько замечаний: вы должны придерживаться согласованного интервала (либо }else{, либо } else {), а также рекомендовать использовать функцию, отличную от mysql_*, поскольку она фактически устарела. Я предлагаю ПДО. - person Madara's Ghost; 19.02.2012
comment
Привет Правда, спасибо за ваши комментарии. Что касается ОП, я согласен с тем, что вам следует использовать PDO; Я тоже не использую mysql_, хотя именно так я научился в первую очередь. PDO также поможет вам предотвратить внедрение SQL. Кроме того, я использовал его интервал, который отличается от обычного соглашения, поэтому несоответствие. Для OP, в миниуме, я бы сказал вам всегда ставить пробел с обеих сторон! если вы его используете. - person phpmeh; 19.02.2012
comment
@phpmeh Это очень близко к работе, мне нужно ввести хотя бы одно из полей, однако я получаю следующую ошибку. Я очень ценю эту помощь. Предупреждение: непредвиденный символ на входе: ''' (ASCII=39) state=1 в /home/gobagtoo/public_html/insert.php в строке 24 Ошибка синтаксического анализа: синтаксическая ошибка, неожиданная T_STRING, ожидание ',' или ';' в /home/gobagtoo/public_html/insert.php в строке 24 - person Matt Douglas; 20.02.2012
comment
Пожалуйста, не используйте никакие соглашения об именах или какие-либо ошибки, которые я сделал, поскольку я использую это, чтобы учиться :) Вы, ребята, НАМНОГО впереди меня в этом материале. Так что я заметил, что в строке «Эхо» вы должны ввести либо адрес электронной почты, либо имя. что в конце была одинарная кавычка и двойная кавычка, я изменил это, и теперь единственная ошибка, которую я получаю, это . Неустранимая ошибка: вызов неопределенной функции mysql_escape_real_string() в /home/gobagtoo/public_html/insert.php в строке 4 - person Matt Douglas; 20.02.2012
comment
Ой, я перепутал слова: us2.php.net /manual/en/function.mysql-real-escape-string.php Вы должны изменить его на mysql_real_escape_string вместо escape_real - person phpmeh; 20.02.2012
comment
@phpmeh, хорошо, я не пытаюсь раздражать в этом, и если бы я мог понять это сам, я бы сделал это, но теперь, ввожу ли я только имя или только адрес электронной почты, я получаю страницу с ошибкой «Вы должны ввести либо адрес электронной почты, либо имя». Если я ввожу оба, я попадаю на страницу, после которой находится цель. - person Matt Douglas; 20.02.2012
comment
Привет, Мэтт. Не раздражает. Извините, я написал плохой код... Строка if прямо сейчас гласит: Если длина строки сообщения электронной почты И длина строки сообщения имени больше 0, выполните следующие действия. Вместо этого должно быть ИЛИ. Измените && на ||. - person phpmeh; 20.02.2012
comment
УДИВИТЕЛЬНО, это мой первый опыт работы с этим веб-сайтом, и я вижу, что с этого момента он станет частью набора инструментов. @phpmeh - СПАСИБО!! Я пообещал это клиенту, думая, что так будет легче научиться. Теперь я многому научился, сделал это вовремя и нашел отличное место для обучения. Большое спасибо. Есть ли способ дать здесь очки репутации? М - person Matt Douglas; 20.02.2012
comment
Я отредактировал код, чтобы отразить изменения, внесенные для исправления ошибок. - person Matt Douglas; 20.02.2012
comment
@phpmeh -› Спасибо за отличный первый опыт stackoverflow! - person Matt Douglas; 20.02.2012
comment
@MattDouglas Рад, что это помогло! Я знаю не так много, как большинство экспертов в этом сообществе, поэтому всегда приятно иметь возможность внести свой вклад. :П - person phpmeh; 20.02.2012