php exec mysql命令 - 不同版本

时间:2015-07-31 00:04:37

标签: 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命令中添加其他参数(选项)吗?如果是这样,发生了什么变化?这段代码在另一台服务器上运行得很好......

2 个答案:

答案 0 :(得分:1)

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

mysqldump上的-r开关是--result-file的简短版本。这个开关有两个基本的东西:

  1. 它会停止\ n在Windows上由\ r \ n转换行结尾。如果你在Windows机器上这样做,这可能就是为什么需要-r的原因。
  2. 即使出现错误,它也会强制转储。这可以解释为什么你创建的转储没有正确插入。你检查了你的转储文件,以确保它没关系?
  3. 所以,这不是一个完全正确的解决方案,但可能有助于让您朝着正确的方向前进:检查您的转储文件并查看它是否存在问题。

    修改

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

    首先检查你的centos机器的字符集

    cat /etc/sysconfig/i18n 
    

    看看它是不是utf-8。如果不是这可能是为什么-r是必需的。

    然后测试你的两个dbs,看看他们的字符集是什么

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

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

    --default-character-set=utf-8 
    

    但是,如果您的mysql未设置为处理utf-8,可能会导致一组完整的错误

答案 1 :(得分:1)

再次回答我自己的问题......

我的问题是由php safe_mode引起的 - 在禁用safe_mode并为用户启用正常的shell访问后,现在一切正常。

此外,一个小细节 - mysql命令需要-p之后没有空格的密码。换句话说,

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

不是有效命令,-p必须后跟密码没有空格。有效命令是:

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

我希望这有助于某人...