php exec mysql 命令 - 不同的版本

标签 php mysql

过去两天我一直在弄乱这个问题,我仍在努力弄清楚......

作为更大脚本的一部分,我尝试在 php 文件中运行以下命令:

$export = exec("/usr/bin/mysqldump -u MY_USERNAME -pMY_PASS DATABASE_NAME products > /path/to/www/directory/sync/products.sql");

此命令不起作用,如果我添加并回显 $result_var,我得到 127 而不是 0,因此显然存在一些错误。经过一些研究,我想出了一个稍微不同的命令,它工作得很好:

$export = exec('mysqldump -u MY_USERNAME -pMY_PASS DATABASE_NAME products -r "/path/to/www/directory/sync/products.sql"');

我的第一个问题 - 有什么区别?为什么第一个选项不起作用? 也许值得一提:在 mysqldump 上使用路径没有区别。我做了一个 which mysqldump 并且第一个命令中的路径是正确的。

我的第二个问题 - 我正在尝试运行以下命令将表导入我的数据库:

$import = exec('/usr/bin/mysql -h localhost -u MY_USERNAME -p MY_PASS DATABASE_NAME < /path/to/www/directory/sync/products.sql')

但是它不起作用,没有任何反应。如果我在命令行中运行它,它只会抛出帮助文本,就像我运行 mysql -?

我在这里错过了什么?我需要添加到 mysql 命令的任何其他参数(选项)吗?如果是这样,发生了什么变化?这段代码在另一台服务器上运行得很好......

最佳答案

我可以立即解决 -r 问题。 -r 问题也很可能与您的第二个问题直接相关。

mysqldump 上的 -r 开关是 --result-file 的简短版本。这个开关做了两件基本的事情:

  1. 它阻止\n 行结尾被\r\n 在 Windows 上转换。如果您在 Windows 机器上执行此操作,这可能就是需要 -r 的原因。
  2. 它强制转储发生,即使有错误。这可以解释为什么您创建的转储没有被正确插入。您是否检查过转储文件以确保它没问题?

所以,这不是一个确切的解决方案,但也许可以帮助您找到正确的方向:检查您的转储文件并查看它是否存在问题。

编辑

如果您的源数据库中有 utf-8,这可能是一个字符编码问题。

先检查一下你centos机器的charset

cat /etc/sysconfig/i18n 

看看是不是utf-8。如果不是,那可能就是为什么需要 -r 的原因。

然后测试你的两个数据库,看看它们的字符集是什么

select schema_name as 'database', default_character_set_name as 'charset', default_collation_name as 'default_collation' from information_schema.schemata;

如果您的源数据库是 utf-8 而您的目标数据库不是,这可以解释为什么插入不起作用。您可以尝试将其添加到您的 import mysql 调用中:

--default-character-set=utf-8 

不过,如果您的 mysql 未设置为处理 utf-8,则可能会导致一整套不同的错误

关于php exec mysql 命令 - 不同的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736054/

相关文章:

php - ROWS是否未在Youtube Analytics API中返回?

php - 使用 Symfony 2 在 Twig 模板中获取内核根目录

javascript - 如何用javascript转换json日期记录

c# - C#连接Mysql数据库

javascript - 如何通过 JustGage 使用 JSON 对象中的变量

javascript - Cakephp:使用 javascript 时按钮的名称不包含在帖子中

php - laravel 一个帐户下的多个电子邮件地址

php - 无法通过 PHP 表单插入到我的 sql 表中

python - 更新到最新的 ubuntu 后,我无法访问 mysql...我该怎么办?

php - Laravel 4.2 不返回 View ::make