-4

私は PHP と SQL を初めて使用しますが、何らかの理由でこの非常に奇妙で不可解なエラーが発生しました。

致命的なエラー: SQL 構文にエラーがあります。/home/ の 1 行目の 'INSER INTO history(stype, symbol, amount, price, time, userid) VALUES (?, ?, ?, ' の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。 jharvard/vhosts/localhost/includes/functions.php の 139 行目

これは私が使用するコードです:

<?php 
require("../includes/config.php");
if ($_SERVER["REQUEST_METHOD"] == "POST"){
    // Retrieve the requested user's symbol and calculate the stock's price
    $symbol = $_POST["symbol"];
    $price = lookup($symbol)["price"];
    // If lookup fails, apologize
    if ($price === null) {
    apologize("Sorry!");}
    // Retrieve user's cash balance
    $cash = query("select cash from users where id = ?", $_SESSION["id"]);
    foreach ($cash as $qux){$cash = $qux["cash"];}
    // Calculate the amount of money needed to buy the amount of stock
    $PayPrice = $_POST["SAmount"] * $price;
    // If user doesnt have enough cash, apologize
    if ($cash < $PayPrice){apologize("Your a cheapskate");}
    // If user enters a decimal or negative number, apologize
    if (preg_match("/^\d+$/", $_POST["SAmount"]) != true){apologize("Y u so decimal");}
    // Deduct the amount of cash from user's money   
    $result = query("UPDATE users SET cash = ? where id = ?", ($cash - $PayPrice), $_SESSION["id"]);
    if ($result === false){apologize("Update failed, cash");}
    // Update the user's stock
    $result = query("INSERT INTO stocks (id, symbol, stock) VALUES (?,?,?) ON DUPLICATE KEY UPDATE stock = stock + ?", $_SESSION['id'], $_POST["symbol"], $_POST["SAmount"], $_POST["SAmount"]);
    if ($result === false){apologize("Update failed, stock");}
    // Update history
    $result = query("INSER INTO history(stype, symbol, amount, price, time, userid) VALUES (?, ?, ?, ?, ?, ?)", 'buy', $symbol, $_POST['SAmount'], $PayPrice, time(), $_SESSION['id']);

}
else{render("BuyPage.php");}

?>

ここに query() コードがあります

function query(/* $sql [, ... ] */)
    {
        // SQL statement
        $sql = func_get_arg(0);

        // parameters, if any
        $parameters = array_slice(func_get_args(), 1);

        // try to connect to database
        static $handle;
        if (!isset($handle))
        {
            try
            {
                // connect to database
                $handle = new PDO("mysql:dbname=" . DATABASE . ";host=" . SERVER, USERNAME, PASSWORD);

                // ensure that PDO::prepare returns false when passed invalid SQL
                $handle->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
            }
            catch (Exception $e)
            {
                // trigger (big, orange) error
                trigger_error($e->getMessage(), E_USER_ERROR);
                exit;
            }
        }

        // prepare SQL statement
        $statement = $handle->prepare($sql);
        if ($statement === false)
        {
            // trigger (big, orange) error
            trigger_error($handle->errorInfo()[2], E_USER_ERROR);
            exit;
        }

        // execute SQL statement
        $results = $statement->execute($parameters);

        // return result set's rows, if any
        if ($results !== false)
        {
            return $statement->fetchAll(PDO::FETCH_ASSOC);
        }
        else
        {
            return false;
        }
    }

この問題は、何が起こっているのかわからないため、奇妙に不可解です。必要だと思われるすべてのコードを含めましたが、さらに必要な場合は教えてください。Ps: 言うまでもなく、履歴に挿入する SQL コードの最後の行を入力した後にのみ問題が発生しました。それ以外はすべて正常に機能していました。

4

1 に答える 1

2

交換:

$result = query("INSER INTO history(stype, symbol, amount, price, time, userid) VALUES (?, ?, ?, ?, ?, ?)", 'buy', $symbol, $_POST['SAmount'], $PayPrice, time(), $_SESSION['id']);

と:

$result = query("INSERT INTO history(stype, symbol, amount, price, time, userid) VALUES (?, ?, ?, ?, ?, ?)", 'buy', $symbol, $_POST['SAmount'], $PayPrice, time(), $_SESSION['id']);
于 2013-04-14T09:06:12.600 に答える