0

これは私の最後の質問 (http://stackoverflow.com/questions/12945119/mysql-function-add-prices-from-multiple-tables) のフォローアップのようなものなので、MySQL コードはそこにあります。私の DB に関するバックグラウンドはすべて SQL Server 2008 と Access でした。私は自分の頭脳をグーグルで検索し、StackOverflow、StackExchange のプログラミングおよび Web 開発者ボードなどで漠然と関連する Q&A をすべて読みました (その免責事項を邪魔にならないようにする必要がありました)。

DreamCoder で関数を実行しましたが、入力を求めるプロンプトが表示されてから関数を実行すると、正しい答え (10 進数) が返されるため、関数のロジックは私が知る限り正しいものです。ただし、PHP から関数を呼び出そうとすると、エラーが発生します。

DB アクセスコードは次のとおりです。

function getQuote($json)

echo("JSON input: ");
var_dump($json);

    $array = json_decode($json, TRUE);
    echo("JSON decoded array: ");
    print_r($array);

    $cheese = $array[0];
    $meat = $array[1];
    $veg = $array[2];   

    $c = db_connect();
    $query = "SELECT calculatePrice($cheese, $meat, $veg)";
    var_dump($query);
    $result  = mysql_query($query , $c);
    if(!$result)
    {
        echo "\nCould not successfully run query ($query) from DB: " . mysql_error();
        exit;
    }

if (mysql_num_rows($result) == 0) {
    echo "No rows found, nothing to print so am exiting";
    exit;
}

while($row = mysql_fetch_assoc($result)){
    echo("Row: ");
    var_dump($row);

    if(!$row)
        die("No price returned!" . var_dump($row));
    else
    {   
        return json_encode($row);   
    }
}  //end while

そして、手動でデータをフィードするために、次の「テスト ハーネス」を作成しました。完全なコードで同じエラーが逐語的に発生するため、JSON が正しく機能していることはわかっています。したがって、問題は PHP または MySQL のいずれかです。

    <?php
        require_once 'DBUtils.php';

    $array = array();
    $array[] = "Chedder";
    $array[] ="Ham";
    $array[] ="Carrot";

    $json = json_encode($array);
    echo("JSON object:");
    var_dump($json);

    $test = getQuote($json);

        echo("Test: ");
        print_r($test);

    ?>

私はMySQLiも試しましたが、同じ取引、同じエラーです。MySQL のドキュメントによると、ごくわずかですが、関数を適切に呼び出し、変数を正しく渡しています。(これに関する PHP のドキュメントは事実上存在しません。それらの例はすべて「SELECT * from tblFoo WHERE bar=4」になります。)

エラーは、チェダーを変数ではなく列名として扱うことです:「「フィールドリスト」の不明な列「チェダー」」。私は何が欠けていますか?

SQLServer と ASP.NET でこれを行うことはできますが、MySQL/PHP はペンギンを混乱させます X_X (Linux ペンギンではなく、動物園のようなものです)。

PHP のバージョンは 5.3.17、MySQL は 5.1 です。PHP 5.4.* には関連するメソッドがいくつかあると思いますが、面倒な PHP バージョンの変更を行う前に、まず 5.3.* オプションを使い果たしたいと思います。

答えはおそらく自明であることは十分に承知しており、自分が何をしているかを学べば、自分を愚かだと呼んで私を凌駕する人はいないことを知っています.

ありがとうございました!このサイトは、Google が質問する前に、私が頼りにしているサイトの近くにあります ^_^ (そして、Google の質問に対する結果の少なくとも 2/3 は、とにかくここから来ています =-p )

編集: OK、MySQL は単独で動作します (SELECT from etc...)。

4

1 に答える 1

1

プログラムは、SQL 文字列インジェクションとプレースホルダーの欠如により、のクエリ文字列を渡しています..

SELECT calculatePrice(Cheddar, Ham, Carrot);

.. は有効な SQL ではありません: [バインドされていない] 列識別子ではなく、文字列リテラルである必要があります。

拡張中: MySQL は、ここに列または式を想定しておりCheddar、 、Ham、およびCarrotは現在の SQL ステートメントの列ではありません。また、式ではありません('Cheddar'または など1 + 41)。これが、エラー メッセージに"Unknown column 'cheddar'"と表示される理由です。このステートメントにはそのような列がバインドされていないためです。

関数が文字列'値を確実に取得するための 1 つの方法は、SQL ステートメントの生成に sを追加することですが、ここで説明するより良い方法があります

また、結果列名も必要ないことを確認してください。たとえばselect calculatePrice(..) as colName、少なくとも SQL Server では必要です。

于 2012-10-19T01:38:03.083 に答える