using mysql LOAD statment in PHP fails, but doing it via command line works
I have a php web page that let’s a person upload a file. I want to extract the file name from $_FILE and then load all the data into my database. My code looks like this:
$myfile = $_FILE['file']['tmp_file']; $executebatchloadsql = 'LOAD DATA LOCAL INFILE "'. $myfile .'" INTO TABLE testtable (fname, lname); mysql_query($executebatchloadsql) or die(mysql_error());
- Am I supposed to use the tmp_file name or the name?
- What do I need to do to get the load data command to work? I’ve tried to follow the post found at MySQL: Enable LOAD DATA LOCAL INFILE but it’s still giving me the same error.
This is what my /etc/mysql/my.cnf looks like in part:
[mysqld] user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking local-infile
The last line is what I added. I also added the same line to the [mysql] section:
After making these changes, I restarted sql:
But I’m still having the problem
I’ve also tried local-infile=1 as per the same post I mention above. But that doesn’t work either.
I’ve tried to add the FILE prvil to the user.. like so:
and then when i showit grants for root, i can see that its been added. but i’m still getting an error message that the used command is not allowed on my version of mysql. Do I need the «=1» after the infile in my my.cfg file?
As a further test, i tried loading the file manually via command line instead of via php and it accepted it. I logged in as root (which is the same id i’m using my app for testing purposes) and then I tried the following command:
mysql> load data local infile '/var/www/testwebsite/abc.csv' into table testtable; Query OK, 3 rows affected, 48 warnings (0.00 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 48
But I can’t seem to get the PHP code working. Thanks.!
Php mysql local infile
Поведение этих функций зависит от установок в php.ini .
Имя | По умолчанию | Место изменения | Список изменений |
---|---|---|---|
mysqli.allow_local_infile | «0» | PHP_INI_SYSTEM | До PHP 7.2.16 и 7.3.3 значением по умолчанию было «1». |
mysqli.local_infile_directory | PHP_INI_SYSTEM | Доступно, начиная с PHP 8.1.0. | |
mysqli.allow_persistent | «1» | PHP_INI_SYSTEM | |
mysqli.max_persistent | «-1» | PHP_INI_SYSTEM | |
mysqli.max_links | «-1» | PHP_INI_SYSTEM | |
mysqli.default_port | «3306» | PHP_INI_ALL | |
mysqli.default_socket | NULL | PHP_INI_ALL | |
mysqli.default_host | NULL | PHP_INI_ALL | |
mysqli.default_user | NULL | PHP_INI_ALL | |
mysqli.default_pw | NULL | PHP_INI_ALL | |
mysqli.reconnect | «0» | PHP_INI_SYSTEM | Удалено, начиная с PHP 8.2.0 |
mysqli.rollback_on_cached_plink | «0» | PHP_INI_SYSTEM |
Прочие детали и определения констант PHP_INI_* смотрите в разделе конфигурационные изменения.
Краткое разъяснение конфигурационных директив.
Разрешает доступ к локальным файлам, с точки зрения PHP, с помощью инструкций LOAD DATA.
Позволяет ограничить загрузку LOAD DATA файлами, расположенными в указанном каталоге.
Включает возможность создавать постоянные соединения с помощью mysqli_connect() .
Максимально возможное количество постоянных соединений. Для неограниченного количества установите в 0.
Максимальное количество соединений MySQL на процесс.
TCP-порт, используемый по умолчанию для соединения с сервером баз данных, если другое значение явно не указано. Если значение по умолчанию не указано, оно будет получено из переменной среды окружения MYSQL_TCP_PORT , директивы mysql-tcp в файле /etc/services или константы MYSQL_PORT , которая задаётся во время компиляции, в указанном порядке. Win32 использует только константу MYSQL_PORT .
Имя сокета по умолчанию, которое используется для соединения с локальной базой данных, если имя сокета не было указано явно.
Имя сервера, которое используется, если имя не было указано явно.
Имя пользователя, используемое по умолчанию, если имя не было указано явно.
Пароль, используемый по умолчанию для подключения к БД, если пароль не был явно указан.
Автоматически восстанавливать соединение при его потере.
Замечание: Эта настройка игнорируется драйвером «mysqlnd» и была удалена в PHP 8.2.0.
Если этот параметр включён, закрытие постоянного соединения откатит любые ожидающие транзакции этого соединения, прежде чем оно будет возвращено в пул постоянных соединений. В противном случае ожидающие соединения будут откатываться только тогда, когда соединение будет повторно использовано или когда оно будет фактически закрыто.
Пользователи не могут устанавливать MYSQL_OPT_READ_TIMEOUT с помощью API-вызовов или установки конфигурационных значений во время работы скрипта. Учтите, что если бы это было возможно, то libmysqlclient и потоки по-разному обрабатывали бы значение MYSQL_OPT_READ_TIMEOUT .
php LOAD DATA LOCAL INFILE csv to mysql
I’ve been trying this for a while and investigating as many avenues as I could before asking my first questions here. I have a very simple csv file. One column, data separated by linux line feeds. I want to import it into the 2nd column (passcode) of a table (codes). The first column is a primary key auto incrementing. Here’s the simple csv data (linux line feeds — \n)
A12345678911 A12345678912 A12345678913 A12345678914
if ($_FILES['upload']['type'] === 'text/csv') < $database = dbconnect(); $getfile = $_FILES['upload']['tmp_name']; $sql = " LOAD DATA LOCAL INFILE $getfile INTO TABLE codes (`passcode`) LINES TERMINATED BY '\n' "; mysql_query($sql); >?>
I can’t get it to work. I’m trying this locally with MAMP. The /tmp/php folder Date Modified gets updated but I can’t see a file there. I’ve even tried larger files since my test file is so simple. I have printed out the $_FILES array after submitting the form.
Array ( [webcodeupload] => Array ( [name] => Aimport.csv [type] => text/csv [tmp_name] => /Applications/MAMP/tmp/php/phpsp9ezx [error] => 0 [size] => 52 ) )
It seems that the expected results are there? I’ve tried the query in phpmyAdmin and it works if I remove the LINES TERMINATED BY clause. I suspect that’s a phpmyAdmin thing, and i’ve also tried this code with and without that clause in the query. Additionally there are a few «undefined index» errors when loading the page. I sort of understand why, and have read threads here indicating ways to mask the errors, but I’d be interested in knowing how to avoid them rather than hide them. Any input would really be appreciated. Thanks.
load data local infile mysql server php Ubuntu
I am posting the resolution since it drove me crazy for a few days — it turned out to be the AppArmor settings. This thread finally got me solved: How can I get around MySQL Errcode 13 with SELECT INTO OUTFILE? I see this is marked as duplicate but all the other suggestions seem to point to editing my.cnf which is not working for me. I cannot get Load Data Local Infile to work. My MySQL server version is 5.5.41 and my Ubuntu version is 14.04.2. My my.cnf has «local-infile» under mysql, mysqld and client. I am below specifying flag 128 in the connection string per another post on Stackoverflow. The code below works great when I run it on the client but now that it lives on the server it continuously throws
mysql> LOAD DATA LOCAL INFILE '/home/aa/ER.csv' -> INTO TABLE ER_import -> FIELDS TERMINATED BY ',' -> LINES TERMINATED BY '\r\n' -> IGNORE 1 LINES -> (Paid_Amount, -> Pro_Number, -> Invoice, -> Ship_Date, -> BL, -> Carrier_Name, -> Check_Number, -> Paid_Date, -> Shipper_City, -> Shipper_State, -> Shipper_Name_1, -> Recipient_City, -> Recipient_State, -> Recipient_Name_1, -> Batch_Number, -> Actual_Weight, -> Billed_Amount -> ); Query OK, 8585 rows affected, 4 warnings (0.21 sec) Records: 8585 Deleted: 0 Skipped: 0 Warnings: 4
yet this keeps retuning that the file is not found: «File ‘/home/aa/ER.csv’ not found (Errcode: 13)» the file is definitely there and permission are correct:
$delete = "DELETE FROM ER_import"; if (!mysqli_query($conn,$delete)) < echo("Error description: " . mysqli_error($conn)); >$query = else die(mysqli_error($conn));