1

レコードを SQL データベースに挿入するために Azure で PHP Web ジョブを実行しようとすると、コードが途中で壊れ続けました$query->execute();

これが私がしたことです。masterまず、SQL データベースにアクセスし、 dbの下にログインを作成しました。

CREATE LOGIN username WITH password='userpassword'

次に、このログインを現在のデータベース (masterではなく の下mydb)にユーザーとして追加しました。

CREATE USER username FROM LOGIN username

次に、このコマンドでこのユーザーに書き込み権限を与えました。

EXEC sp_addrolemember N'db_datawriter', N'username'

これらすべてを行った後、portal.azure に移動し、App Service を開き、WebJobs に移動して.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 を起動すると、Runningステータスが から に変わりましたPending restart

[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: 情報] 致命的なエラー: メッセージ 'SQLSTATE[42000] を含む例外 'PDOException' がキャッチされていません: [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near '日'。' D:\local\Temp\jobs\continuous\myjobname\uf5ls33g.42d\myjobzipfolder\updateRecord.php:20 内

誰でもこの問題を解決する方法を診断できますか? SQL ステートメントの準備方法や実行方法に問題はありません。

4

1 に答える 1

1

準備済みステートメントを正しく使用していないため、SQL が無効になります。

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

$cmandを引用することもできます$span。これも機能します。上記の使用法は、準備されたステートメントが使用されることを意図した方法です。ドライバーが引用を処理します。

クエリが DB に到着したとき、次のようになりました。

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

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

于 2016-09-10T21:35:09.463 に答える