如果存在mysql错误

时间:2013-02-18 17:13:54

标签: php mysql sql

查询错误:您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以便在'IF EXISTS附近使用正确的语法(SELECT flag FROM welcomecall WHERE customerID ='6767')                 在第1行选择标志

此查询不在第1行附近,因此我不确定错误是什么。有人可以建议吗? :)

<?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";

2 个答案:

答案 0 :(得分:1)

您不能在例程(存储过程,函数和例程)之外的MySQL中使用IF语句。您需要通过发出多个查询并查看结果来完成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?,或者PDO为http://php.net/manual/en/pdo.prepared-statements.php)。

其他查询类型的行为符合预期。

我将把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查询中调用,但这很糟糕,不会这样做。

答案 1 :(得分:0)

我认为您对查询的“CASE”语法感到困惑:http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html 使用(completeley)“CASE”语法用于存储过程:http://dev.mysql.com/doc/refman/5.0/en/case.html