2016-09-10 2 views
1

В попытке запустить PHP webjob на Azure, чтобы вставить запись в базу данных SQL, мой код продолжал ломаться по линии $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, и открыл мой App Service, перешла к 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 или выполняю ее.

ответ

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 нужно цитировать. Использование заполнителей и привязка позволяет драйверу сделать это для вас, а экранирование значений в этих переменных не требуется.

 Смежные вопросы

  • Нет связанных вопросов^_^