2016-05-12 4 views
1

Я обращаюсь к большому db в php, и я делаю это не достаточно хорошо. У меня есть код, в котором я нуждаюсь, я просто не могу найти хороший способ свести эти утверждения.PHP/SQL, уменьшить количество запросов

$q = $_GET['q']; 
    (dbinit) 
    $query = "SELECT post_id FROM wp_postmeta WHERE meta_key = '_billing_email' AND meta_value = '$q'"; 
    $result = mysql_query($query); 

    while ($row = mysql_fetch_array($result)) 
{ 
$thing = $row['post_id']; 
$querys = "SELECT 'meta_value' FROM wp_postmeta WHERE post_id = '$thing' AND meta_key = '_order_number'"; 
$results = mysql_query($querys); 
$rows = mysql_fetch_array($results); 
$postid = $rows['meta_value']; 
$queryss = "SELECT post_id FROM $table WHERE meta_value = $postid AND meta_key = '_order_number'"; 
$resultss = mysql_query($query); 
$rowss = mysql_fetch_array($result); 
$order_id = $rowss['post_id']; 
(handling) 
} 

мне интересно, если есть более эффективный способ сделать эти запросы, или, возможно, у них в одном запросе?

+4

Используйте соединения, обновите свой драйвер, используйте параметризованные запросы. – chris85

+0

@ chris85 так много величия в стольких словах - если бы я мог, снова поднял бы голову. – JimL

+0

** ПРЕДУПРЕЖДЕНИЕ **: вы создали опасную ошибку [SQL injection bug] (http://bobby-tables.com/), поставив данные '$ _GET' непосредственно в ваш запрос. ** НИКОГДА не делайте этого. Вместо этого используйте функцию WordPress [готовые заявления] (http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks) для правильного удаления всех параметров данных. – tadman

ответ

0

Не знаете, где $table.

Но это JOIN попытка должна работать:

$q = $_GET['q']; 
// ... dbinit ... 

$query = "SELECT wpp.post_id, 
     wpp1.meta_value as orderNumber, 
     wpp2.post_id as orderId 

    FROM wp_postmeta wpp 
    LEFT JOIN wp_postmeta wpp1 
    ON wpp1.post_id = wpp.post_id 
     AND wpp1.meta_key = '_order_number' 
    LEFT JOIN $table wpp2 
    ON wpp2.meta_value = wpp1.meta_value 
     AND wpp2.meta_key = '_order_number' 
    WHERE wpp.meta_key = '_billing_email' 
     AND meta_value = '$q'"; 

$result = mysql_query($query); 
while ($row = mysql_fetch_array($result)) { 
    (handling) 
} 

Как вы можете видеть, вы можете получить

$thing = $row['post_id']; 
$order_id = $row['orderId']; 

внутри цикла, если это необходимо.

+0

Сэр, ты теперь мой бог. – Bc1151

+0

@ Bc1151 не забудьте закрыть SQL-инъекцию. – chris85

Смежные вопросы