За последние 24 часа нас посетили 16415 программистов и 1555 роботов. Сейчас ищут 838 программистов ...

Не получается разобраться с массивом и условием.

Тема в разделе "PHP для новичков", создана пользователем Sofia, 3 апр 2019.

  1. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    а причем тут html ? php форум ведь
    Ты ходь код мой смотрела ?o_O
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Ты гонишь, но да пофиг.

    Хотя, может, и слеплю эти несколько строк и выложу куда-нибудь демку.

    P.S. Лучше PHP-код покажи.
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Слепил.

    Основная часть клиентского обработчика и форма:
    PHP:
    1. <?php
    2.  
    3. extra('head-section','
    4. <script>
    5. function checkemail()
    6. {
    7.  var xhr;
    8.  
    9.  ...
    10.  
    11.  xhr.open("POST","/check",true);
    12.  xhr.onreadystatechange = function()
    13.  {
    14.    if (xhr.readyState==4)
    15.    {
    16.      document.getElementById("result").innerHTML=xhr.status==200?(xhr.responseText.length?xhr.responseText:"Available"):"Error!";
    17.    }
    18.  }
    19.  xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    20.  xhr.send("email="+encodeURIComponent(document.getElementById("email").value));
    21.  document.getElementById("result").innerHTML="Please wait...";
    22.  return false;
    23. }
    24. </script>');
    25.  
    26. ?>
    27. <h1><?= $page['name'] ?></h1>
    28. <form method="post" action="/404" onsubmit="return checkemail();">
    29. <input type="text" id="email" name="email" value="test@test.ru">
    30. <input type="submit" value="Check">
    31. <p id="result"></p>
    32. </form>
    Серверный обработчик:
    PHP:
    1. // это такой вариант вилки «форма/обработчик» – не обращайте особого внимания
    2. if (isset($_POST['email']))
    3. {
    4.   if (filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL) or error(503))
    5.   {
    6.     if ($result=mysqli_query($link,'SELECT `id` FROM `site_users` WHERE `email`="'.mysqli_real_escape_string($link,$_POST['email']).'"') or error(503))
    7.     {
    8.       echo mysqli_fetch_row($result)?'Exists':'';
    9.       //mysqli_free_result($result);
    10.       //mysqli_close($link);
    11.       exit;
    12.     }
    13.   }
    14. }
    В паблик демку выкладывать лень, но, уверяю, все работает.
    --- Добавлено ---
    P.S. Вместо первого вызова error() можно написать что-то вроде echo 'Invalid format!' :)
     
  4. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    4/6 строка if = всегда true / с echo "что-то вроде" Parse error: syntax error, unexpected
     
    miketomlin нравится это.
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Да, для echo нужно перенести вывод из условия в блок else. Либо использовать die() для вывода текста.
    --- Добавлено ---
    error() – это моя ф-ция. Должна возвращать приравненное к false. Или null хотя бы дефолотом (т.е. когда return не используется). Либо вообще не должна возвращать управление.
     
    #30 miketomlin, 6 апр 2019
    Последнее редактирование: 6 апр 2019
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    P.S. Кстати, в представленном коде вместо echo+exit тоже можно использовать die() с текстом. Но это все мелочи.
     
  7. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    лишний.

    Жду софию, у нее там нашли видно sql-injection
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Babka_Gadalka, я же написал, что конкретно на это не нужно обращать особого внимания ;)
    --- Добавлено ---
    Короче это что-то вроде:
    PHP:
    1. if ($_SERVER['REQUEST_METHOD']==='POST')
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я вчера ей предложил код, минималистический, но в то же время рабочий, что она на это ответила, я хотела сделать не так)
    и сделала по своему, тоже жду кода от нее в студии, как она его изменила)
    PHP:
    1. <?php
    2. # выводим ошибки erors warnings и т.д.
    3. ini_set('display_errors',1);
    4.  
    5. # Работа с базой данных
    6. include 'db.php';
    7.  
    8.  
    9. # проверяем чтобы какой метод отправляет данные
    10. if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
    11. {
    12.     # пустой массив для работы с ошибками
    13.    $err = [];
    14.  
    15.     # фильтруем данные
    16.    $args = [
    17.         'u_email' => FILTER_VALIDATE_EMAIL,
    18.         'u_pass_1' => FILTER_DEFAULT,
    19.         'u_pass_2' => FILTER_DEFAULT
    20.     ];
    21.  
    22.     $filter = filter_input_array ( INPUT_POST, $args );
    23.  
    24.     # проверяем ввод email в поле
    25.    if ( empty ( $filter['u_email'] ) )
    26.     {
    27.         $err['u_email'] = 'email не валидный';
    28.     }
    29.  
    30.     $stmt = $pdo -> prepare('SELECT `email` FROM `users` WHERE `email` = ?');
    31.     $stmt -> execute( [ $filter['u_email'] ] );
    32.     $row = $stmt -> fetch();
    33.  
    34.     # проверяем email на занятость
    35.    if ( $row > 0 )
    36.     {
    37.         $err['u_email'] = 'email занят';
    38.     }
    39.  
    40.     # проверяем количество ошибок
    41.    if ( count ( $err ) > 0 )
    42.     {
    43.         echo implode('<br>', $err);
    44.     }
    45.     else
    46.     {
    47.         # вставляем новый email
    48.        $stmt = $pdo -> prepare('INSERT INTO `users`(`email`) VALUES (?)');
    49.         $stmt -> execute( [ $filter['u_email'] ] );
    50.         # Сюда редирект нужно вставить
    51.        echo 'Новая запись вставлена';
    52.     }
    53. }
     
    Babka_Gadalka нравится это.
  10. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    Есть rowCount()
    --- Добавлено ---
    там filter_input уже будет достаточно, так как он один входной/post параметр проверяет и если что-либо не так, он отдает отрицание условию
     
    _ne_scaju_ нравится это.
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    согласен, но можно и без него обойтись, вроде по желанию, я не знаю что будет быстрее)
    тут не понял не много, достаточно будет, а что убрать то?)
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Babka_Gadalka, еще раз, то ветвление (условие) «к делу не относится». То вилка GET/POST, т.к. у меня и вывод формы, и обработчик висят на одном адресе.

    Это уже вариации. Мы с бабкой об этом писали. Можно вообще SELECT COUNT(*)... использовать.
    --- Добавлено ---
    @_ne_scaju_, либо проверяй результаты выполнения запросов, либо используй механизм исключений, выставляя соотв. флаг PDO.

    И как нужно делать вставку, я тоже уже в теме успел написать ;)
     
  13. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    и будет у тебя в num_rows всегда 1 иначе для условия всегда true
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Babka_Gadalka, Mля, неужели непонятно что с SELECT COUNT(*) нужно использовать выбранное значение :mad:
     
  15. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    Продолжаем господа ! 10 - 0 Россия проигрывает
     
  16. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    :D
    PHP:
    1. list($count)=mysqli_fetch_row($result);
    2. if ($count)
    --- Добавлено ---
    Короче прекращаем этот (субботний) марафон :)
     
  17. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    и будешь делать два запроса, один для count, другой для вывода данных
     
  18. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Моя тема тут – только чекер «есть/нет» и ошибки. Да, для живого чекера отдельный SELECT. Для вставки SELECT вообще не нужен, о чем ранее писал.
     
  19. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    а для мертвого чекера зачем придумали num_rows / rowCount ?
     
  20. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    «живого поиска»
    --- Добавлено ---
    Речь про отдельные запросы с клиента. Сначала «живой чекер», а потом безусловная вставка с анализом результата. Как это и положено делать.
     
  21. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    Что такое живой поиск ? а есть танцующий поиск ?
    --- Добавлено ---
    почему сразу не одним запросом сделать вставку, а потом с помощью api инструмента, узнать кол-во возвращаемых строк и дальше работать с данными ?
    --- Добавлено ---
    где об этом написано ?
     
  22. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Babka_Gadalka, ты пример ТСа смотрел(а)?
    --- Добавлено ---
    ...Кнопка «вставки» становится активной, только когда вводится незаюзанный логин/мыло.
     
  23. Babka_Gadalka

    Babka_Gadalka Активный пользователь

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    не имеет значения, там два запроса рационально
    1. для вытягивания из бд весь контент, далее in_array сверка
    2. добавление по условию если
    3. с 1 запроса по implode

    Продолжаем.
     
  24. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Не, меня спать зовут :)