fapchat
@fapchat

Почему sql запрос в php работает неверно?

617050462c1fc469567239.pngВ таблице mysql, если ввести команду
SELECT * FROM users WHERE email = 'hhh' OR phone = "+380714293848";
например, то будет пустой списочек, однако через код php почему-то у меня условие if ($stmt->fetch())срабатывает в любом случае, если был введён номер телефона, соответствующий моей регулярке. Т.е. даже если номера в таблице нет, то всё равно пользователь получает сообщение:
Вы уже оставили заявку

C имейлом такой проблемы нет, и лишь если он есть в таблице, то тогда пользователь получит сообщение:
Вы уже оставили заявку


Вот код
if(isset($_POST['name0']) && isset($_POST['email0']) && isset($_POST['phone0']))
   {

    $name = $_POST['name0'];
    $email = $_POST['email0'];
    $phone = $_POST['phone0'];
     if((mb_strlen($name) > 1 && !ctype_digit($name) && preg_match('/^((([0-9A-Za-z]{1}[-0-9A-z\.]{1,}[0-9A-Za-z]{1})|([0-9А-Яа-я]{1}[-0-9А-я\.]{1,}[0-9А-Яа-я]{1}))@([-A-Za-z]{1,}\.){1,2}[-A-Za-z]{2,})$/u', $email) || preg_match('/((8|\+7)-?)?\(?\d{3,5}\)?-?\d{1}-?\d{1}-?\d{1}-?\d{1}-?\d{1}((-?\d{1})?-?\d{1})?/', $phone)))
       {

        $stmt = $connection->prepare("SELECT * FROM users WHERE email = ? OR phone = ?");
        $stmt->bind_param("ss", $email, $phone); 
        $stmt->execute();    
        if ($stmt->fetch()) 
        {  
          ?>
        <script>
            Swal.fire({text: 'Вы уже оставили заявку',
            confirmButtonColor: '#e31e35'})
        </script>        
        <?php
            $stmt->close();
        }   
//......

P.S. Я знаю, что для имени по-хорошему тоже стоит писать регулярку, а не делать всё моим путём...
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
fapchat
@fapchat Автор вопроса
Нужно было разделить запрос
SELECT * FROM users WHERE email = 'hhh' OR phone = "+380714293848";
на несколько(сам запрос я оставил, зато добавил ещё несколько, чтобы решить свою проблему), чтобы при указании лишь телефона, без имайла, не получалось так, что все поля, в которых имейл пуст, будут соответствовать запросу
SELECT * FROM users WHERE email = 'hhh' OR phone = "+380714293848";
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@bitwheeze
В SQL только одиночные кавычки для строковых значений используются. В двойные только идентификаторы берутся. По этому phone = "+380714293848" работать не будет.
Ответ написан
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
В контексте mysqli Вам следует использовать $stmt->store_result(); и после $stmt->num_rows()

$stmt = $connection->prepare(
    "SELECT * FROM users WHERE email = ? OR phone = ?"
);
$stmt->bind_param("ss", $email, $phone);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows() > 0) {
    echo "Вы уже оставили заявку";
} else {
	echo "Новая заявка";
}


Share PHP code online

или объявить таблицу с уникальными ключами и обрабатывать исключения:

CREATE TABLE users (
  email varchar(255), 
  phone varchar(255), 
  UNIQUE KEY (email), 
  UNIQUE KEY (phone)
);


$stmt = $connection->prepare(
    "INSERT INTO users (email, phone) VALUES (?, ?)"
);
$stmt->bind_param("ss", $email, $phone);

try {
	$stmt->execute();
} catch (Exception $e) {
    die("Вы уже оставили заявку");
	
}

echo "Заявка сохранена в системе";


PHP fiddle
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы