Ты гонишь, но да пофиг. Хотя, может, и слеплю эти несколько строк и выложу куда-нибудь демку. P.S. Лучше PHP-код покажи.
Слепил. Основная часть клиентского обработчика и форма: PHP: <?php extra('head-section',' <script> function checkemail() { var xhr; ... xhr.open("POST","/check",true); xhr.onreadystatechange = function() { if (xhr.readyState==4) { document.getElementById("result").innerHTML=xhr.status==200?(xhr.responseText.length?xhr.responseText:"Available"):"Error!"; } } xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xhr.send("email="+encodeURIComponent(document.getElementById("email").value)); document.getElementById("result").innerHTML="Please wait..."; return false; } </script>'); ?> <h1><?= $page['name'] ?></h1> <form method="post" action="/404" onsubmit="return checkemail();"> <input type="text" id="email" name="email" value="test@test.ru"> <input type="submit" value="Check"> <p id="result"></p> </form> Серверный обработчик: PHP: // это такой вариант вилки «форма/обработчик» – не обращайте особого внимания if (isset($_POST['email'])) { if (filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL) or error(503)) { if ($result=mysqli_query($link,'SELECT `id` FROM `site_users` WHERE `email`="'.mysqli_real_escape_string($link,$_POST['email']).'"') or error(503)) { echo mysqli_fetch_row($result)?'Exists':''; //mysqli_free_result($result); //mysqli_close($link); exit; } } } В паблик демку выкладывать лень, но, уверяю, все работает. --- Добавлено --- P.S. Вместо первого вызова error() можно написать что-то вроде echo 'Invalid format!'
Да, для echo нужно перенести вывод из условия в блок else. Либо использовать die() для вывода текста. --- Добавлено --- error() – это моя ф-ция. Должна возвращать приравненное к false. Или null хотя бы дефолотом (т.е. когда return не используется). Либо вообще не должна возвращать управление.
P.S. Кстати, в представленном коде вместо echo+exit тоже можно использовать die() с текстом. Но это все мелочи.
@Babka_Gadalka, я же написал, что конкретно на это не нужно обращать особого внимания --- Добавлено --- Короче это что-то вроде: PHP: if ($_SERVER['REQUEST_METHOD']==='POST')
я вчера ей предложил код, минималистический, но в то же время рабочий, что она на это ответила, я хотела сделать не так) и сделала по своему, тоже жду кода от нее в студии, как она его изменила) Спойлер: Код обработчик PHP: <?php # выводим ошибки erors warnings и т.д. ini_set('display_errors',1); error_reporting(E_ALL); # Работа с базой данных include 'db.php'; # проверяем чтобы какой метод отправляет данные if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { # пустой массив для работы с ошибками $err = []; # фильтруем данные $args = [ 'u_email' => FILTER_VALIDATE_EMAIL, 'u_pass_1' => FILTER_DEFAULT, 'u_pass_2' => FILTER_DEFAULT ]; $filter = filter_input_array ( INPUT_POST, $args ); # проверяем ввод email в поле if ( empty ( $filter['u_email'] ) ) { $err['u_email'] = 'email не валидный'; } $stmt = $pdo -> prepare('SELECT `email` FROM `users` WHERE `email` = ?'); $stmt -> execute( [ $filter['u_email'] ] ); $row = $stmt -> fetch(); # проверяем email на занятость if ( $row > 0 ) { $err['u_email'] = 'email занят'; } # проверяем количество ошибок if ( count ( $err ) > 0 ) { echo implode('<br>', $err); } else { # вставляем новый email $stmt = $pdo -> prepare('INSERT INTO `users`(`email`) VALUES (?)'); $stmt -> execute( [ $filter['u_email'] ] ); # Сюда редирект нужно вставить echo 'Новая запись вставлена'; } }
Есть rowCount() --- Добавлено --- там filter_input уже будет достаточно, так как он один входной/post параметр проверяет и если что-либо не так, он отдает отрицание условию
согласен, но можно и без него обойтись, вроде по желанию, я не знаю что будет быстрее) тут не понял не много, достаточно будет, а что убрать то?)
@Babka_Gadalka, еще раз, то ветвление (условие) «к делу не относится». То вилка GET/POST, т.к. у меня и вывод формы, и обработчик висят на одном адресе. Это уже вариации. Мы с бабкой об этом писали. Можно вообще SELECT COUNT(*)... использовать. --- Добавлено --- @_ne_scaju_, либо проверяй результаты выполнения запросов, либо используй механизм исключений, выставляя соотв. флаг PDO. И как нужно делать вставку, я тоже уже в теме успел написать
PHP: list($count)=mysqli_fetch_row($result); mysqli_free_result($result); if ($count) --- Добавлено --- Короче прекращаем этот (субботний) марафон
Моя тема тут – только чекер «есть/нет» и ошибки. Да, для живого чекера отдельный SELECT. Для вставки SELECT вообще не нужен, о чем ранее писал.
«живого поиска» --- Добавлено --- Речь про отдельные запросы с клиента. Сначала «живой чекер», а потом безусловная вставка с анализом результата. Как это и положено делать.
Что такое живой поиск ? а есть танцующий поиск ? --- Добавлено --- почему сразу не одним запросом сделать вставку, а потом с помощью api инструмента, узнать кол-во возвращаемых строк и дальше работать с данными ? --- Добавлено --- где об этом написано ?
@Babka_Gadalka, ты пример ТСа смотрел(а)? --- Добавлено --- ...Кнопка «вставки» становится активной, только когда вводится незаюзанный логин/мыло.
не имеет значения, там два запроса рационально для вытягивания из бд весь контент, далее in_array сверка добавление по условию если с 1 запроса по implode Продолжаем.