1

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

此查询不在第 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";
4

2 回答 2

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 + 存储过程,如何访问“out”值?了解更多信息,或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 查询中调用,但这太糟糕了,永远不要这样做。

于 2013-02-18T17:21:12.707 回答
0

我认为您混淆了查询的“CASE”语法:http: //dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html 与使用的(完全不同的)“CASE”语法对于存储过程:http ://dev.mysql.com/doc/refman/5.0/en/case.html 。

于 2013-02-18T17:27:14.530 回答