2009-05-02 9 views
2

ich mit PHP exec, ruft mysql Befehl ein extrem einfaches Skript funktioniert:Aufruf MySQL exe PHP exec nicht

$dbhost = 'localhost'; 
    $dbuser = 'root'; 
    $dbpass = 'mypass'; 
    $db = 'job'; 
    $file ='job_create.sql'; 
    $mySQLDir='"C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql"'; 



    if ($dbpass != '') { 
     $cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' --password='.$dbpass.' < "'.dirname(__FILE__).'\\'.$file.'"'; 
    } else { 
     $cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' < "'.dirname(__FILE__).'\\'.$file.'"'; 
    } 

    // echo $cmd; 
    exec($cmd,$out,$retval); 

ich erwarten würde, dass das obige Skript mysql Befehl aufruft, in der Benutzer-Authentifizierung übergeben Informationen und führen Sie die job_create.sql im laufenden Betrieb.

Die einzige Sache ist, dass es nicht funktioniert, in dem Sinne, dass die job_create.sq l nicht ordnungsgemäß ausgeführt wird. . Ich habe versucht, mysql Befehl direkt von der Kommandozeile mit dem folgenden Skript aufrufen,

bin\mysql.exe -h localhost --user=root --password=mypass < "job_create.sql" 

und es funktioniert.

Irgendeine Idee, wie man das repariert?

Edit: Ich rufe dieses Skript von PHP Befehlszeile. d. h., PHP.exe installdb.php

+0

Warum nicht Sie die mysql-Bindungen statt Aufruf über die Shell verwenden hinzufügen? – troelskn

Antwort

4

fand ich die Lösung

Das Problem ist, dass Sie die $cmd in "" .ie ausdrücklich eingeschlossen müssen,

exec('"'.$cmd.'"',$out ,$retval); 

Dies ist der vollständige Code ist, das funktioniert:

<?php 

    $dbhost = 'localhost'; 
    $dbuser = 'root'; 
    $dbpass = 'password'; 
    $db = 'job'; 
    $file =dirname(__FILE__).'\\'.'job_create.sql'; 
    $mySQLDir='"C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe"'; 



    if ($dbpass != '') { 
     $cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' --password='.$dbpass.' < "'.$file.'"'; 

    } else { 
     $cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' < "'.$file.'"'; 
    } 

    echo $cmd; 

    exec('"'.$cmd.'"',$out ,$retval); 
    echo "\n"; 
    echo ($retval); 

?> 
1

sollte zwischen -p und mypass kein Platz sein.

BTW Ich schlage vor, Sie verwenden Sie das Formular --password=mypass

+0

Hallo, ich habe deinen Vorschlag ausprobiert. Der direkte Aufruf von MySQL funktioniert, aber der Aufruf von PHP mit exec funktioniert immer noch nicht – Graviton

0

Versuchen Sie es proc_open() anstelle von exec() verwenden.
Mit proc_open können Sie die Fehler anzeigen, die ein Befehlszeilentool gibt.

2

Das Problem hier ist wahrscheinlich, dass

mysql < file.sql 

auf einem Rohrbetrieb abhängt, die von der Shell erleichtert wird. Wenn PHP den Befehl direkt mit etwas wie der exec *() Familie von API-Aufrufen statt über eine Shell ausführt, wird dies nicht funktionieren. Ich weiß, dass die Shell tatsächlich auf Linux verwendet wird, aber das ist unter Windows möglicherweise nicht der Fall. Das Handbuch gibt nicht genau an, wie der Befehl ausgeführt wird.

Versuchen Sie, den -e-Flag und den Quelle-Befehl statt mit:

bin\mysql.exe -h localhost --user=root --password=mypass -e 'source job_create.sql' 

Dies unabhängig von der Art und Weise funktionieren sollte, dass der Befehl aufgerufen wird.

2

Ihr Skript sollte funktionieren, aber versuchen Sie auf jeden Fall, das -e-Flag und den Befehl 'source' anstelle des Codes < als Best Practice zu verwenden.

Es besteht die Möglichkeit, dass das Skript als anderer Benutzer ausgeführt wird als Sie und keine Befehlszeilenberechtigung zum Ausführen des Befehls besitzt. Überprüfen Sie die Benutzerberechtigungen.

2

Das passierte mir auch auf Ubuntu.Das Problem war, dass ich den folgenden Code tat:

$mysql = shell_exec("sudo which mysql"); 
$cmd = "$mysql --host=$host --user=$user --password=$pass -D $dbname -e 'source $base_sql_file'"; 
exec($cmd, $output, $retvar); 

nur eine geringe Detail fehlte ... die shell_exec die Ausgabe mit Zeichen Trailling zurück. Beim Ausführen des Befehls bekam ich eine MySQL error 127 (Record is crashed).

Die Lösung war einfach: ein trim function-shell_exec :)

$mysql = trim(shell_exec("sudo which mysql")); 
$cmd = "$mysql --host=$host --user=$user --password=$pass -D $dbname -e 'source $base_sql_file'"; 
exec($cmd, $output, $retvar);