2016-09-10 8 views
1

SQLデータベースにレコードを挿入するためにAzureでPHPウェブジョブを実行しようとしたところ、私のコードは$query->execute();行を破り続けていました。Azure:PHP SQL Webjobが機能しません。なぜそれはクエリ "execute()"文にスローされますか?

ここに私がしたことがあります。最初に私は私のSQLデータベースに行き、masterデシベルの下でログインを作成:

CREATE LOGIN username WITH password='userpassword' 

その後、私は(ないmasterの下で、しかしmydb下)私の現在のデータベース内のユーザーとして、このログインを追加しました:

CREATE USER username FROM LOGIN username 

は、その後、私は、このコマンドを使用してこのユーザーの書き込み権限を与えた:

EXEC sp_addrolemember N'db_datawriter', N'username' 

はすべてこれを行ったので、私はその後portal.azureに入った、と開かれた私AppJobsにナビゲートし、.zipファイルを2つのファイルでアップロードしました。

スケジューラ、settings.job

{ 
    "schedule": "0 */5 * * * *" 
} 

そして、私のメインのPHPコード、updateRecord.php

<?php 

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 

try { 
    $conn = new PDO ("sqlsrv:server = myazuresite.database.windows.net,1433; Database = mydb", "username", "userpassword"); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch (PDOException $e) { 
    print("Error connecting to SQL Server."); 
} 

$cm = 'cm'; 
$span = '1day'; 

$stf = $conn->prepare("INSERT INTO mydbtable 
VALUES ($cm, $span, 1, 2, 3, 4, 12.34);"); 
$stf->execute(); 

echo $stf; 

unset($conn); 
unset($stmt); 

?> 

私はWebJobを立ち上げたとして、それはPending restartRunning状態から行ってきました。

[09/10/2016 21:03:14 > 82e662: SYS INFO] Detected WebJob file/s were updated, refreshing WebJob 
[09/10/2016 21:03:14 > 82e662: SYS INFO] Status changed to Starting 
[09/10/2016 21:03:14 > 82e662: SYS INFO] Run script 'updateRecord.php' with script host - 'PhpScriptHost' 
[09/10/2016 21:03:14 > 82e662: SYS INFO] Status changed to Running 
[09/10/2016 21:03:15 > 82e662: INFO]  
[09/10/2016 21:03:15 > 82e662: INFO] Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'day'.' in D:\local\Temp\jobs\continuous\myjobname\uf5ls33g.42d\myjobzipfolder\updateRecord.php:20 
[09/10/2016 21:03:15 > 82e662: INFO] Stack trace: 
[09/10/2016 21:03:15 > 82e662: INFO] #0 D:\local\Temp\jobs\continuous\gAnaytics\uf5ls33g.42d\myjobzipfolder\updateRecord.php(20): PDOStatement->execute() 
[09/10/2016 21:03:15 > 82e662: INFO] #1 {main} 
[09/10/2016 21:03:15 > 82e662: INFO] thrown in D:\local\Temp\jobs\continuous\jobs\uf5ls33g.42d\myjobzipfolder\updateRecord.php on line 20 
[09/10/2016 21:03:15 > 82e662: SYS ERR ] Job failed due to exit code 255 
[09/10/2016 21:03:15 > 82e662: SYS INFO] Process went down, waiting for 60 seconds 
[09/10/2016 21:03:15 > 82e662: SYS INFO] Status changed to PendingRestart 

全体WebJobログの最も関連性の高い、最もに関するビーイング:

[09/10/2016 21:03:15 > 82e662: INFO] Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'day'.' in D:\local\Temp\jobs\continuous\myjobname\uf5ls33g.42d\myjobzipfolder\updateRecord.php:20

誰もがこの問題を解決するためにどのように診断することはできますか?私はSQL文をどのように準備するか、それを実行する方法に何か間違っているとは思わない。

答えて

1

準備文を間違って使用しているため、無効なSQLが発生しています。

$stf = $conn->prepare("INSERT INTO mydbtable 
VALUES (?, ?, 1, 2, 3, 4, 12.34);"); 
$stf->execute(array($cm, $span)); 

あなたは$cm$spanを引用可能性があり、これも動作します。上記の使用法は、準備されたステートメントが使用されることを意味します。ドライバが引用符を処理します。

あなたのクエリはそれがあったDBに到着しました:引用符で囲む必要

INSERT INTO mydbtable 
VALUES (1day, cm, 1, 2, 3, 4, 12.34); 

ので1daycm。プレースホルダとバインディングを使用すると、ドライバがこれを行うことができ、それらの変数のエスケープ値は必要ありません。

関連する問題