2015-12-14 65 views
0

我有一個MySQL的句子就像如果我在phpMyAdmin的執行它的魅力:問題與MySQL的句子包括兩個臨時表創建

CREATE TEMPORARY TABLE hash1 
     SELECT * FROM 
     (
     (
      SELECT DISTINCT feature_id AS fl, feature_value AS fv FROM gf_product_features WHERE feature_id = '1' AND feature_value = 'No frost total' 
     ) UNION 
     (
      SELECT DISTINCT feature_id AS fl, feature_value AS fv FROM gf_product_features WHERE feature_id = '3' AND feature_value = '43' 
     )) AS q; 


     CREATE TEMPORARY TABLE hash2 
     SELECT * FROM hash1; 

     SELECT 
      p.id AS id, 
      p.main_image AS main_image, 
      p.type AS taxonomy, 
      p.name AS model, 
      p.sku AS sku, 
      p.price AS price, 
      b.brand_name AS brand_name, 
      b.brand_image AS brand_logo, 
      pf.feature_value AS feature_value, 
      f.feature AS feature_label, 
      f.id AS feature_id 
     FROM 
     (
      SELECT a.* 
      FROM gf_product AS a 
      INNER JOIN 
      (
      SELECT product_id 
      FROM 
      (
       SELECT a.product_id , count(*) AS commons 
       FROM gf_product_features AS a 
       INNER JOIN hash1 AS b 
       ON a.feature_id = b.fl 
       AND a.feature_value = b.fv 
       GROUP BY a.product_id 
      ) AS features 
       WHERE commons = (SELECT count(*) AS count FROM hash2) 
      ) b1 ON a.id = b1.product_id 
     ) AS p 
     INNER JOIN gf_brands AS b 
      ON p.brand_id = b.id 
     INNER JOIN gf_product_features AS pf 
      ON pf.product_id = p.id 
     INNER JOIN gf_features AS f 
      ON pf.feature_id = f.id 
     ORDER BY price ASC, 
        feature_id ASC 

我想執行通過Ajax請求的PHP函數,即構建dinamically SQL語句以上,但我總是得到這個錯誤在我的瀏覽器的控制檯:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE TEMPORARY TABLE hash2 
     SELECT * FROM hash1; 

     SELECT 
     ' at line 12 

就這樣,下面的錯誤太:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /www/htdocs/example/inc/functions.php on line 538 

對應於該行的我的PHP代碼:

while ($row = mysqli_fetch_assoc($result)) 

也許克隆HASH2表從HASH1

CREATE TEMPORARY TABLE hash2 
     SELECT * FROM hash1; 

聽起來不可思議,但如果我不這樣做的這樣,在我的phpMyAdmin我得到這個錯誤:

#1137 - Can't reopen table: 'b' 

我不明白爲什麼我的sql語句在我的phpMyadmin中工作正常,但是當我在我的PHP文件中構建它時,它不起作用。有人可以幫我嗎?

如需進一步信息,這是我的PHP代碼:

function getProductsFromFilteredQuery($connection, $filters, &$html) 
{ 
    $sql = ''; 
    $m = count($filters); // $filters are an array of values like this: ['value1A, value2A', 'value1B, value2B', ...] 

    $sql = 'CREATE TEMPORARY TABLE hash1 
     SELECT * FROM 
     ('; 

    for ($n = 0; $n < $m; $n++) 
    { 
     $string     = explode(', ', $filters[$n]); 
     $feature_id   = $string[0]; 
     $feature_value = $string[1]; 

     $sql .= " 
     (
      SELECT DISTINCT feature_id AS fl, feature_value AS fv FROM gf_product_features WHERE feature_id = '" . $feature_id . "' AND feature_value = '" . $feature_value . "' 
     )"; 

     if ($n < ($m - 1)) 
     { 
      $sql .= ' UNION '; 
     } 
    } 


    $sql .= ') AS q; 


     CREATE TEMPORARY TABLE hash2 -- In this line I get an error 
     SELECT * FROM hash1; 

     SELECT 
      p.id AS id, 
      p.main_image AS main_image, 
      p.type AS taxonomy, 
      p.name AS model, 
      p.sku AS sku, 
      p.price AS price, 
      b.brand_name AS brand_name, 
      b.brand_image AS brand_logo, 
      pf.feature_value AS feature_value, 
      f.feature AS feature_label, 
      f.id AS feature_id 
     FROM 
     (
      SELECT a.* 
      FROM gf_product AS a 
      INNER JOIN 
      (
      SELECT product_id 
      FROM 
      (
       SELECT a.product_id , count(*) AS commons 
       FROM gf_product_features AS a 
       INNER JOIN hash1 AS b 
       ON a.feature_id = b.fl 
       AND a.feature_value = b.fv 
       GROUP BY a.product_id 
      ) AS features 
       WHERE commons = (SELECT count(*) AS count FROM hash2) 
      ) b1 ON a.id = b1.product_id 
     ) AS p 
     INNER JOIN gf_brands AS b 
      ON p.brand_id = b.id 
     INNER JOIN gf_product_features AS pf 
      ON pf.product_id = p.id 
     INNER JOIN gf_features AS f 
      ON pf.feature_id = f.id 
     ORDER BY price ASC, 
        feature_id ASC'; 

    $result = mysqli_query($connection, $sql); 

    while ($row = mysqli_fetch_assoc($result)) // In this line I get an error too 
    { 
     // Do some stuff... and at last, return the resulting $html 
    } 
}; 

回答

0

我終於能找到的錯誤。在我的phpMyAdmin中,它也可以工作,因爲有人可以在SQL控制檯中執行多個查詢。它沒有問題。

但是,當通過PHP編碼mySQL查詢時,您只能一次運行一個mySQL語句。那麼,有一個例外:您可以使用mysqli_multi_query + mysqli_more_results或類似的東西。但是當我編碼它時,你不能。

所以有兩種選擇:像上面兩個鏈接頁面中描述的那樣重寫PHP代碼,或者在PHP函數中執行幾個mysqli_query

我決定通過第二個選項來做到這一點,所以工作代碼如下(注意每個mysqli_query後評論):

function getProductsFromFilteredQuery($mysqli, $filters, &$html) { 
$sql = ''; 
$m = count($filters); 

$sql  = 'DROP TEMPORARY TABLE IF EXISTS hash1;'; 
$result = mysqli_query($mysqli, $sql); // A single query 

$sql  = 'DROP TEMPORARY TABLE IF EXISTS hash2;'; 
$result = mysqli_query($mysqli, $sql); // Another single query 

$sql  = 'CREATE TEMPORARY TABLE hash1 
    SELECT * FROM 
    ('; 

for ($n = 0; $n < $m; $n++) 
{ 
    $string     = explode(', ', $filters[$n]); 
    $feature_id   = $string[0]; 
    $feature_value = $string[1]; 

    $sql .= " 
    (SELECT DISTINCT feature_id AS fl, feature_value AS fv FROM gf_product_features WHERE feature_id = '" . $feature_id . "' AND feature_value = '" . $feature_value . "')"; 

    if ($n < ($m - 1)) 
    { 
     $sql .= ' UNION '; 
    } 
} 


$sql .= ') AS q1'; 
$result = mysqli_query($mysqli, $sql); // Another single query 

$sql = 'CREATE TEMPORARY TABLE hash2 
    SELECT * FROM hash1;'; 
$result = mysqli_query($mysqli, $sql); // Another single query 

$sql = 'SELECT 
       p.id AS id, 
       p.main_image AS main_image, 
       p.type AS taxonomy, 
       p.name AS model, 
       p.sku AS sku, 
       p.price AS price, 
       b.brand_name AS brand_name, 
       b.brand_image AS brand_logo, 
       pf.feature_value AS feature_value, 
       f.feature AS feature_label, 
       f.id AS feature_id 
      FROM 
      (
       SELECT a.* 
       FROM gf_product AS a 
       INNER JOIN 
       (
       SELECT product_id 
       FROM 
       (
        SELECT a.product_id , count(*) AS commons 
        FROM gf_product_features AS a 
        INNER JOIN hash1 AS b 
        ON a.feature_id = b.fl 
        AND a.feature_value = b.fv 
        GROUP BY a.product_id 
       ) AS features 
        WHERE commons = (SELECT count(*) AS count FROM hash2) 
       ) b1 ON a.id = b1.product_id 
      ) AS p 
      INNER JOIN gf_brands AS b 
       ON p.brand_id = b.id 
      INNER JOIN gf_product_features AS pf 
       ON pf.product_id = p.id 
      INNER JOIN gf_features AS f 
       ON pf.feature_id = f.id 
      ORDER BY price ASC, 
         feature_id ASC'; 

$result = mysqli_query($mysqli, $sql); // Another single query. The last one. 

while ($row = mysqli_fetch_assoc($result)) 
{ 
    // My stuff here... 
} 
}; // @END of function