2016-09-10 2 views
1

Bei dem Versuch, einen PHP-Webjob auf Azure auszuführen, um einen Datensatz in eine SQL-Datenbank einzufügen, wurde mein Code in der Zeile $query->execute(); unterbrochen.Azure: PHP SQL Webjob funktioniert nicht. Warum wird es auf die Abfrage "execute()" Anweisung geworfen?

Hier ist was ich getan habe. Zuerst habe ich in meine SQL-Datenbank ging und erstellt eine Anmeldung unter dem master db:

CREATE LOGIN username WITH password='userpassword' 

Dann habe ich diese Login als Benutzer in meiner aktuellen Datenbank (nicht unter master, aber unter mydb):

CREATE USER username FROM LOGIN username 

dann ist diese Benutzer Schreibrechte mit diesem Befehl gab ich:

EXEC sp_addrolemember N'db_datawriter', N'username' 

alles getan zu haben, ging ich dann in portal.azure, und öffnete meine App Service, navigierte zu WebJobs und lud eine .zip Datei mit zwei Dateien hoch;

Ein Scheduler, settings.job:

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

Und mein Haupt-PHP-Code, 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); 

?> 

Als ich die WebJob startete, ging es von Running Status 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 

Die relevanteste des gesamten WebJob Log und die meisten über Wesen:

[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

Kann jemand diagnostizieren, wie dieses Problem zu lösen? Ich sehe nichts falsch daran, wie ich meine SQL-Anweisung vorbereite oder ausführe.

Antwort

1

Sie verwenden vorbereitete Anweisungen falsch und dies führt zu ungültigem SQL.

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

könnten Sie zitieren die $cm und $span und dies würde auch funktionieren. Die obige Verwendung ist die Art, wie vorbereitete Anweisungen verwendet werden sollen. Der Fahrer behandelt das Angebot.

Wenn Ihre Abfrage bei der DB angekommen war:

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

so die 1day und cm benötigt zitiert werden. Wenn Sie die Platzhalter und die Bindung verwenden, kann der Treiber dies für Sie tun, und das Entkommen von Werten in diesen Variablen ist nicht erforderlich.