1

次のデータベースを検討してください。

var1    int(10) Auto Increment   
var2    varchar(255)     
var3    int(10)  
var4    tinyint(1) unsigned  
var5    int(10)  
var6    tinyint(1) unsigned [0]  
var7    tinyint(1) unsigned [0]

あるドメインに、JSONP GET を別のドメインの .php スクリプトにする jQuery を含むページがあります。

クライアント jQuery:

$.ajax({
    url:        "https://1.2.3.4/xxx/xxx.php",
    timeout:    5000,
    data: {     "var1":     "xxx",
                "var2":     "xxx",
                "var3":     "xxx",
                "var4":     "xxx",
                "var5":     "xxx",
                },
    dataType: "jsonp",
    success: function(data) {
    alert(data);
    },
});

サーバー PHP:

<?php
header('content-type: application/json; charset=utf-8');
header("access-control-allow-origin: *");

if($_SERVER['HTTP_REFERER'] != "xxx" || !isset($_GET['callback']))
{
    sendResponse(400, 'Invalid request');
    exit();
}

// Check for required parameters
if (    isset($_GET["var1"]) && 
        isset($_GET["var2"]) && 
        isset($_GET["var3"]) &&
        isset($_GET["var4"]) &&
        isset($_GET["var5"]))
{
    if($_GET["var1"] == "xxx")
    {
        $var2    = $_GET["var2"];
        $var3    = intval($_GET["var3"]);
        $var4    = intval($_GET["var4"]);
        $var5    = intval($_GET["var5"]);

        $db = new mysqli('localhost', 'root', 'xxx', 'xxx');
        $db->autocommit(FALSE);

        $result = $db->query("INSERT INTO xxx (`xxx`, `xxx`, `xxx`, `xxx`) VALUES ('$var2', $var3, $var4, $var5)");
        $requestID = $db->insert_id;

        $data = array("requestID" => $requestID, "errorMessage" => $db->error);

        echo $_GET['callback'] . '('.json_encode($data).')';  
    }
}
?>

INSERT が機能しているようです。JSON で有効な「insert_id」を取得します。また、「1」を示す影響を受けた行の数を返そうとしました。しかし、後でそのテーブルを見ると、何らかの理由でテーブルに行がありませんか?

同じユーザーとしてログインしているときに、同じINSERTステートメントを使用してそのテーブルに手動で挿入できます(「ルート」-試して絞り込むだけです!)。PHP エラーは発生せず、$db->error何も返されません。後で MySQL のテーブルを見ると、自動インクリメント ID フィールドが 1 つ増えていますが、データは存在しません。

何か案は?!

4

2 に答える 2

1

ところで...

Ajax/jQuery に構文エラー (カンマ) があります,...

$.ajax({
    url:        "https://1.2.3.4/xxx/xxx.php",
    timeout:    5000,
    data: {     "var1":     "xxx",
        "var2":     "xxx",
        "var3":     "xxx",
        "var4":     "xxx",
        "var5":     "xxx"  //<-- HERE
    },
    dataType: "jsonp",
    success: function(data) {
        alert(data);
    } //<----------------------- HERE
});
于 2013-10-01T14:06:56.677 に答える