2013-02-18 51 views
1

查詢錯誤:您的SQL語法錯誤;檢查與您的MySQL服務器版本對應的手冊,以便在'IF EXISTS(SELECT flag FROM welcomecall WHERE customerID ='6767')附近使用正確的語法 第1行,所以我不知道錯誤是什麼。任何人都可以請指教? :)如果存在mysql錯誤

<?php 
$db_link = mysql_connect('localhost', 'secrets', '') or die('Could not connect to the database.'); 
mysql_select_db('thedb', $db_link) or die('Could not find the database table.'); 

require "/home/directory/public_html/app/Mage.php"; 
//umask(0); 
Mage::app(); 
Mage::getSingleton('core/session', array('name'=>'frontend')); 

$session = Mage::getSingleton('customer/session'); 
if($session->isLoggedIn()) { 
    print_r($session); 
    $customerID = $session->getCustomerId(); 
    print("Customer ID is ". $customerID); 
} else { 
    echo 'Not logged In'; 
} 
    $action = $_POST['action']; 
    switch($action) { 
     case 'retrieve' : retrieveFlag();break; 
     case 'postValue1' : postValue();break; 
     // ...etc... 
    } 


function retrieveFlag(){ 
    global $customerID; 
    $query="IF EXISTS(SELECT flag FROM welcomecall WHERE customerID= '$customerID') 
       SELECT flag FROM welcomecall WHERE customerID=" . $customerID . " 
      ELSE 
       INSERT INTO welcomecall VALUES (" .$customerID .",0)"; 

    $result = mysql_query($query) or die('Error in the query: ' . mysql_error()); 
} 

function postValue(){ 
    $query="IF EXISTS(SELECT flag FROM welcomecall WHERE customerID=" . $customerID . ") 
       SELECT flag FROM welcomecall WHERE customerID=" . $customerID; 
    $result = mysql_query($query) or die('Error in the query: ' . mysql_error()); 

    if ($result==0){ 
    $query="UPDATE welcomecall SET flag=1 WHERE customerID=" .$customerID. ")";   
    $result = mysql_query($query) or die('Error in the query: ' . mysql_error()); 
    } 
    else if($result==1){ 
    $query="UPDATE welcomecall SET flag=0 WHERE customerID=" . $customerID. ")";    
    $result = mysql_query($query) or die('Error in the query: ' . mysql_error()); 
    } 
} 
?> 

也試圖與以下的錯誤:

$query="SELECT CASE 
      WHEN EXISTS(SELECT flag FROM welcomecall WHERE customerID= '$customerID') 
       THEN SELECT flag FROM welcomecall WHERE customerID=" . $customerID . " 
      ELSE 
       INSERT INTO welcomecall VALUES (" .$customerID .",0) 
      END"; 
+0

這是MySQL觸發的SQL語法錯誤。 PHP和SQL是不同的語言! – 2013-02-18 17:17:37

+0

你應該檢查一下MySQL手冊,這看起來不是有效的sql語句。 – CuriousMind 2013-02-18 17:18:23

回答

1

不能使用IF程序之外在MySQL語句(存儲過程,函數和程序)。您需要通過發出多個查詢並查看結果來完成PHP中的工作,或者您可以編寫一個存儲過程在數據庫中爲您完成工作(請參閱:http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html)。第三種方法是使用INSERT ... ON DUPLICATE KEY UPDATE(請參閱:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html),或者甚至使用REPLACE INTO而不是INSERT INTO(請參閱:http://dev.mysql.com/doc/refman/5.0/en/replace.html)。

從PHP,您可以使用此語法調用存儲過程:

$query = "CALL my_stored_procedure(arg1, arg2, ...)"; 

注意存儲過程可以返回一個結果就像一個SELECT語句。在這種情況下,我建議使用出站參數將數據返回給PHP(請參閱:PHP + MySql + Stored Procedures, how do I get access an "out" value?瞭解更多信息,或者http://php.net/manual/en/pdo.prepared-statements.php用於PDO)。

其他查詢類型的行爲與預期相同。

我會留下詳細的做法,以PHP中的幾個查詢作爲練習給讀者,但如果你被卡住了,我會很樂意提供更多信息。

此外,請不要使用mysql_ *函數。他們已被棄用。改用MySQLi或PDO。

進一步解釋:

SQL Server和可能其他數據庫允許你提交查詢批處理時,使用命令式結構。在T-SQL中,你可以說像

IF EXISTS(SELECT id FROM foo WHERE id = 5) 
    UPDATE foo SET bar = 7 
ELSE 
    INSERT INTO foo (bar) VALUES (7) 
GO 

這真的很不錯。 MySQL不允許使用命令式結構,例如IF語句,CASE語句(不要與CASE表達式混淆 - 請參閱下一段),循環和遊標以在普通查詢中使用。相反,它們必須包含在存儲過程,函數或觸發器中。這是一個相當煩人的限制,但你無能爲力。

您最後一次查詢不起作用的原因是因爲您在SELECT查詢中添加了數據修改查詢。您只能將其他SELECT查詢嵌入爲子查詢。原因在於子查詢處於預期標量或集合的位置,並且除了修改數據外,INSERT也不返回,這會破壞SELECT [1]的語義。考慮你要求查詢做什麼。你說你想要返回一個數據集,或者根據數據庫中的數據來插入一些新的數據。這兩種選擇是矛盾的。你可以做一個或另一個,但不能同時做。所以MySQL不允許這種類型的東西。

[1]通過在函數中放入一個INSERT,可以從SELECT查詢中調用INSERT,但這樣做太糟糕了,千萬不要這樣做。

+0

+1,但您也可以在函數中使用「IF .. ELSE .. END IF」。 – GarethD 2013-02-18 17:30:42

+0

@GarethD:我使用存儲過程作爲任何類型的例程的簡寫,但我會更新我的答案,以便更清楚。 – siride 2013-02-18 17:37:04