2013-04-16 5 views
0

Я извлек этот фрагмент из своего кода, так как им было интересно, что есть лучший способ сделать это. Я надеюсь, кто-то может мне помочь или указать мне в правильном направлении.Действительно ли этот код PDO?

В основном этот код проверяет множество таблиц в базе данных и проверяет, возвращается ли результат или нет.

$stmt = $conn->prepare('SELECT email FROM 1table WHERE email = :email'); 
    $stmt = $conn->prepare('SELECT email FROM 2table WHERE email = :email'); 
    $stmt = $conn->prepare('SELECT email FROM 3table WHERE email = :email'); 
    $stmt->bindParam(':email', $email); 
$stmt->execute(); 
    if($stmt->fetch(PDO::FETCH_NUM) > 0){ 

Есть ли лучший способ? или более продуктивным способом, который мог бы рассказать мне, в какой таблице был найден результат?

+0

Вы держите переписав переменную '$ stmt', поэтому единственный запрос, чтобы идти вперед (это мой опыт) является последним –

+0

насчет' СОЮЗА '? –

+0

@WesleySchleumer может 'UNION' сказать мне, какая таблица содержала результат? – Ricki

ответ

1

Ни один из предыдущей anwsers показывает вам, как знать, какой talbe являются данными. Таким образом, если это уместно, это правильный UNION

$sql = "SELECT email, '1table' as fromTable FROM 1table WHERE email = :email"; 
$sql .= " UNION ALL"; 
$sql .= " SELECT email, '2table' FROM 2table WHERE email = :email"; 
$sql .= " UNION ALL"; 
$sql .= " SELECT email, '3table' FROM 3table WHERE email = :email"; 
+0

Можете ли вы объяснить, как я узнаю, откуда пришел результат? 'fromTable' будет держать это, но как бы я проверить? – Ricki

+0

'$ fieldArr = $ stmt-> fetch (PDO :: FETCH_ASSOC);' это даст ассоциативный массив со всеми полями или false, если больше нет строк для извлечения –

+0

, работавших фантастически! Тем не менее, он не может вернуть несколько экземпляров в массиве, это не важно для меня, так что это лучший способ сделать это! – Ricki

1

Это действует PHP, но логика не действует:

$stmt = $conn->prepare('SELECT email FROM 1table WHERE email = :email'); 
$stmt = $conn->prepare('SELECT email FROM 2table WHERE email = :email'); 
$stmt = $conn->prepare('SELECT email FROM 3table WHERE email = :email'); 

Вы держите перезапись $stmt с новым значением. Это означает, что $stmt будет содержать только последний отчет.

Вы можете посмотреть на UNION и изменить код следующим образом:

$sql = '(SELECT email FROM 1table WHERE email = :email)'; 
$sql .= 'UNION ALL'; 
$sql .= '(SELECT email FROM 2table WHERE email = :email)'; 
$sql .= 'UNION ALL'; 
$sql .= '(SELECT email FROM 3table WHERE email = :email)'; 
$stmt = $conn->prepare($sql); 
+0

, возможно, по одному за раз? выполнение каждого из них, чтобы увидеть, существует ли результат? или это слишком много времени? – Ricki

+0

@ Рики, посмотрите на редактирование. – Shoe

+0

Спасибо, я думаю, я могу работать с этим! – Ricki

1

Это будет использовать только последний запрос. Вы можете сделать это:

$stmt = $conn->prepare(' 
    (SELECT email FROM 1table WHERE email = :email) 
    union all 
    (SELECT email FROM 2table WHERE email = :email) 
    union all 
    (SELECT email FROM 3table WHERE email = :email)'); 
Смежные вопросы