SQL Server — Azure: PHP SQL Webjob не работает. Почему он вызывается по запросу & quot; execute () & quot; заявление?

В попытке запустить веб-работу PHP в Azure для вставки записи в базу данных SQL мой код постоянно ломался $query->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, открыл службу приложений, перешел на 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] Неустранимая ошибка: необработанное исключение
«PDOException» с сообщением «SQLSTATE [42000]: [Microsoft] [SQL Server
Собственный клиент 11.0] [SQL Server] Неверный синтаксис рядом с «днем». в
D: \ Local \ Temp \ работа \ непрерывная \ 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 и это тоже будет работать. Вышеупомянутое использование — способ, которым подготовленные операторы предназначены, чтобы использоваться все же. Водитель обрабатывает цитирование.

Когда ваш запрос прибыл в БД, это было:

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

Итак 1day а также cm нужно было процитировать. Использование заполнителей и привязки позволяет драйверу сделать это за вас, и экранирование значений в этих переменных не требуется.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]