2013-01-23 14 views
6

Rozwiązanie tego problemu może być proste w porównaniu z moim widokiem.Zmienne MYSQL w zapytaniu php

Próbuję uruchomić kwerendę MYSQL przechowywane jako ciąg znaków w PHP. Zapytanie działa poprawnie z użyciem narzędzia DBM, takiego jak Navicat, ale zwraca false w moim środowisku programistycznym PHP. Czy jest coś, na co skończyłem?

SET @running_sum = 0; 

SELECT 
    TID, 
    SumTotal, 
    T.`Freight`, 
    T.`Insurance`, 
    T.`Discount`, 
    CONCAT(
     '$', 
     FORMAT(
      @running_sum :[email protected]_sum + SumTotal + T.`Freight` + T.`Insurance` - T.`Discount`, 
      2 
     ) 
    ) AS 'Running Total' 
FROM 
    (
     SELECT 
      TID, 
      SUM(Quantity * UnitNetValue) AS SumTotal, 
      T.`Freight`, 
      T.`Insurance`, 
      T.`Discount` 
     FROM 
      Transactions T 
     JOIN `Transactions_Products` P ON T.TransactionID = P.TID 
     WHERE 
      (
       T.TemplateName = '' 
       OR T.TemplateName IS NULL 
      ) 
     AND T. STATUS = 1 
     GROUP BY 
      TransactionID 

    ) AS T; 

Wykonuję kwerendę taką jak ta;

$result = mysql_query($this->query); 

$this->query to ciąg znaków, który zawiera powyższe zapytanie, ponieważ jest wyświetlany powyżej.

Odpowiedz

16

Problem polega na tym, że mysql_query() nie obsługuje wielu zapytań. Twój SET @running_sum = 0; jest uważany za odrębny zapytania i tak będziesz musiał wykonać ten pierwszy:

$result1 = mysql_query("SET @running_sum = 0;"); 

$result2 = mysql_query($this->query); // <-- without the SET ... query 

Z Manual:

mysql_query() wysyła unikalny zapytanie (wielokrotne zapytania nie są obsługiwane)


marginesie: biblioteka mysql_* jest przestarzała, zaleca się uaktualnienie do nowoczesnej MySQ Biblioteka L, taka jak PDO lub MySQLi.

+0

Dziękuję za pomoc MrCode. To jest bardzo cenione. Zaktualizuję mój kod, aby wziąć to pod uwagę. –

+0

Należy również mieć na uwadze względy bezpieczeństwa podczas używania mysqli_multi_query() do wysyłania wielu zapytań naraz. Z mysqli_multi_query() otwieramy się na wstrzykiwane zapytania, takie jak "; DROP DATABASE". http://php.net/manual/en/mysqli.quickstart.multiple-statement.php – Paul

2

wstaw zmienną podobną do tej. myślę, że to powinno działać.

mysql_query("SELECT @i:=0"); 
mysql_query("UPDATE table_name SET id = @i:[email protected]+1"); 
+0

Przepraszam, ja misread go. Usunąłem swój komentarz. Usuń też swoje i możemy udawać, że nic nie powiedziałem. Przepraszam. – Ariel

2

Nie jest również możliwe użycie multi_query metodę zamiast query z MySQLi:

$query = "SET @running_sum = 0; SELECT ..."; 
$db_link->multi_query($query);