Azure:PHP SQL Web 作业不工作。为什么它会在查询 "execute()" 语句中抛出?
Azure: PHP SQL Webjob not working. Why does it get thrown on query "execute()" statement?
为了 运行 Azure 上的 PHP webjob 将记录插入 SQL 数据库,我的代码一直在 $query->execute();
行中断。
这是我所做的。首先,我进入我的 SQL 数据库并在 master
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,打开我的应用程序服务,导航到 WebJobs 并上传一个包含两个文件的 .zip
文件;
一个调度器,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: 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 语句的方式有任何问题。
您错误地使用了预处理语句,这导致无效 SQL。
$stf = $conn->prepare("INSERT INTO mydbtable
VALUES (?, ?, 1, 2, 3, 4, 12.34 );");
$stf->execute(array($cm, $span));
您可以引用 $cm
和 $span
,这也可以。上面的用法是准备语句的使用方式。驱动程序处理报价。
当您的查询到达数据库时:
INSERT INTO mydbtable
VALUES (1day, cm, 1, 2, 3, 4, 12.34 );
所以需要引用 1day
和 cm
。使用占位符和绑定允许驱动程序为您执行此操作,并且不需要转义这些变量中的值。
为了 运行 Azure 上的 PHP webjob 将记录插入 SQL 数据库,我的代码一直在 $query->execute();
行中断。
这是我所做的。首先,我进入我的 SQL 数据库并在 master
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,打开我的应用程序服务,导航到 WebJobs 并上传一个包含两个文件的 .zip
文件;
一个调度器,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: 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 语句的方式有任何问题。
您错误地使用了预处理语句,这导致无效 SQL。
$stf = $conn->prepare("INSERT INTO mydbtable
VALUES (?, ?, 1, 2, 3, 4, 12.34 );");
$stf->execute(array($cm, $span));
您可以引用 $cm
和 $span
,这也可以。上面的用法是准备语句的使用方式。驱动程序处理报价。
当您的查询到达数据库时:
INSERT INTO mydbtable
VALUES (1day, cm, 1, 2, 3, 4, 12.34 );
所以需要引用 1day
和 cm
。使用占位符和绑定允许驱动程序为您执行此操作,并且不需要转义这些变量中的值。