2011-01-05 19 views
7

Ich mache das SELECT LOAD_FILE("/home/user/domains/example.com/public_html/robots.txt") AS tmp FROM tmpTable, aber es gibt NULL zurück. Wie kann ich überprüfen, ob dies daran liegt, dass ich das FILE-Privileg nicht habe oder etwas anderes? MySQL gibt keinen Fehler aus. (Ich bin mit PHP)MySQL LOAD_FILE NULL zurückgeben

Jeder, der Erfahrung mit LOAD_FILE hat, sagen Sie mir über diese Funktion :)

<?php 
$result = mysql_query('SELECT LOAD_FILE("/home/user/domains/example.com/public_html/robots.txt") AS tmp FROM tmpTable') or die(mysql_error()); 
while($row = mysql_fetch_assoc($result)) 
{ 
var_dump($row['tmp']); 
} 
+0

zeigen Bitte den vollständigen Code Sie die Abfrage auszuführen verwenden –

+0

Dies ist der vollständige Code (Testcode) – Simon

+0

haben Sie den Benutzer mit den Berechtigungen erteilt? GRANT FILE ON *. * Für mich; –

Antwort

4

Sieht aus wie einige Versionen von MySQL auf Linux-Distributionen haben einen Fehler mit der LOAD_FILE Funktion. Hier ist the thread. Am Ende des Threads sieht es so aus, als könnte es einen Workaround geben.

EDIT:

Da Sie auf einem gemeinsamen Host sind, an der Funktionalität suchen Sie könnten Sie einfach die Datei stattdessen lesen? Mit der file() sollte die Datei in ein Array-Format lesen.

5

Eine wirklich hässliche Abhilfe kann hier gefunden werden:

http://angkatbahu.blogspot.com.es/2011/03/mysql-loadfile-function-in-ubuntu-it_12.html

Wenn Sie die Dateien setzen Sie in/var/lib/mysql/all_images Verzeichnis, es funktioniert laden möchten!

in ubuntu Getestet 12,10 (und nein, Dateien zu MySQL-Benutzer chomd'ing, hat nicht funktioniert)

+0

Das funktionierte für mich auf Ubuntu 12.04. Vielen Dank! –

+0

Während die Problemumgehung hässlich ist, habe ich festgestellt, dass Sie Ihre Bilder nicht in/var/lib/mysql/all_images ablegen müssen. Ich habe/var/lib/mysql/foo_images benutzt und es hat gut funktioniert. Dank dessen konnte ich mein Datenbankschema-Installationsprogramm (ein Debian-Paket)/var/lib/mysql/foo_images erstellen, es mit Bilddateien füllen, dann in meinem Postinst meine SQL-Vollversion von LOAD_FILEs ausführen und dann/var/lib/löschen mysql/foo_images. Das Endergebnis ist tadellos sauber mit minimaler Wahrscheinlichkeit, die MySQL-Installation zu vermasseln, und die Zwischenstufen waren auch nicht schlecht. Ich bin zufrieden. –

+1

der Grund, warum die anderen Verzeichnisse fehlgeschlagen ist, war der apparmor Block –

1

zu sehen, was Privilegien Sie haben, show grants verwenden.

Ich habe einige zusätzlichen Befehle dokumentieren Sie überprüfen können, wenn Sie die Bedingungen hier erfüllen:

http://pastebin.com/Dvsdxh9Y

Nachtrag Ich würde in die Dokumentation machen. Stellen Sie sicher:

  • gibt es Ausführungsberechtigung für das übergeordnete Verzeichnis
  • Die Berechtigung FILE wird deutlich hingewiesen gewährt müssen. (. GRANT FILE auf TO user @ localhost)
  • Sie haben Privilegien gespült
  • Sie haben sich abgemeldet und wieder angemeldet

Beispiel Berechtigung für Elternverzeichnis:

 

mysql> \! ls -ld `dirname /home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg` 
drwxrwxr--. 2 jlam jlam 4096 May 12 14:22 /home/jlam/code/projectName/doc/filesForTesting/images 

mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/image 

Test01.jpg')); 
+-------------------------------------------------------------------------------------------------------------+ 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) | 
+-------------------------------------------------------------------------------------------------------------+ 
| NULL                          | 
+-------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 



mysql> \! chmod o+x /home/jlam/code/projectName/doc/filesForTesting/images 
mysql> \! ls -ld `dirname /home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg` 
drwxrwxr-x. 2 jlam jlam 4096 May 12 14:22 /home/jlam/code/projectName/doc/filesForTesting/images 
mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'))                                 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

Beispiel für Benutzerrechte:

 

16:38:09 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal 
Enter password: 

mysql> show grants; 
+-----------------------------------------------------------------------------------------------------------------+ 
| Grants for [email protected]                     | 
+-----------------------------------------------------------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'eventCal'@'localhost' IDENTIFIED BY PASSWORD '*xxxxx' | 
| GRANT ALL PRIVILEGES ON `tmp`.* TO 'eventCal'@'localhost'              | 
| GRANT ALL PRIVILEGES ON `eventCalTesting`.* TO 'eventCal'@'localhost'           | 
| GRANT ALL PRIVILEGES ON `eventCal`.* TO 'eventCal'@'localhost'             | 
| GRANT ALL PRIVILEGES ON `eventCal_categoryMigration`.* TO 'eventCal'@'localhost'        | 
+-----------------------------------------------------------------------------------------------------------------+ 
5 rows in set (0.00 sec) 

mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); 
+-------------------------------------------------------------------------------------------------------------+ 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) | 
+-------------------------------------------------------------------------------------------------------------+ 
| NULL                          | 
+-------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

In anderen er root Sitzung:

 

mysql> grant file ON *.* to [email protected]; 
Query OK, 0 rows affected (0.00 sec) 

mysql> flush privileges; 
Query OK, 0 rows affected (0.00 sec) 

Zurück in Benutzersitzung, ich kann immer noch nicht die Datei laden

 

mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); 
+-------------------------------------------------------------------------------------------------------------+ 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) | 
+-------------------------------------------------------------------------------------------------------------+ 
| NULL                          | 
+-------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

.....Aber wenn ich mich wieder auslogge und wieder in:

 

mysql> exit 
Bye 

16:40:14 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal 
Enter password: 

mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'))                                 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

+1

Darüber hinaus kann apparmor auf ubuntu linux und anderen Orten stören. –

Verwandte Themen