1

クエリのエラー:SQL構文にエラーがあります。1行目の「IFEXISTS(SELECT flag FROM welcomecall WHERE customerID = '6767')SELECT flag」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

このクエリは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 )。3 番目のオプションは、INSERT...ON DUPLICATE KEY UPDATE ( http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.htmlを参照) または INSERT の代わりに REPLACE INTOを使用することです。 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を参照してください) 。 PDO の場合は/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] のセマンティクスが壊れます。クエリに何を求めているかを考えてください。データベース内のデータに関する何らかの事実に応じて、データセットを返すか、新しいデータを挿入したいと言っています。2 つのオプションは矛盾しています。どちらか一方を行うことはできますが、両方を行うことはできません。したがって、MySQL はこの種のことを許可しません。

[1] SELECT クエリから呼び出すことができる関数内に INSERT を配置することで、これを回避できますが、これはひどいことであり、決して実行しないでください。

于 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 に答える