php exec mysql命令-不同版本

php exec mysql命令-不同版本,php,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\u var,我得到的是127而不是0,因此显然存在一些错误。经过一些研

在过去的两天里,我一直在搞砸这件事,现在仍在努力想办法

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

$export = exec("/usr/bin/mysqldump -u MY_USERNAME -pMY_PASS DATABASE_NAME products > /path/to/www/directory/sync/products.sql");
这个命令不起作用,如果我添加并回显
$result\u var
,我得到的是127而不是0,因此显然存在一些错误。经过一些研究,我终于想出了一个稍微不同的命令,它工作得很好:

$export = exec('mysqldump -u MY_USERNAME -pMY_PASS DATABASE_NAME products -r "/path/to/www/directory/sync/products.sql"');
我的第一个问题有什么不同?为什么第一个选项不起作用? 也许值得一提的是:在
mysqldump
上使用path没有任何区别。我做了一个mysqldump的
,第一个命令中的路径是正确的

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

$import = exec('/usr/bin/mysql -h localhost -u MY_USERNAME -p MY_PASS DATABASE_NAME < /path/to/www/directory/sync/products.sql')
$import=exec('/usr/bin/mysql-h localhost-u MY_USERNAME-p MY_PASS DATABASE_NAME
但它不起作用,什么也没发生。如果我在命令行中运行它,它只会抛出帮助文本,就像我运行
mysql-?


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

我可以立即解决-r问题。还有一个很大的可能性是-r问题与您的第二个问题直接相关

mysqldump上的-r开关是--result文件的简短版本。此开关有两个基本功能:

  • 它阻止windows上的\r\n转换行结尾。如果您在windows设备上执行此操作,这可能就是需要-r的原因
  • 即使存在错误,它也会强制转储。这可以解释为什么您创建的转储没有正确插入。你检查过你的转储文件了吗 因此,这不是一个确切的解决方案,但可能有助于让您朝着正确的方向看:检查您的转储文件,看看是否有问题

    编辑

    如果源数据库中有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,那么可能会导致一系列单独的错误

    再次回答我自己的问题

    我的问题是由php安全模式引起的——在禁用安全模式并为用户启用正常的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')
    

    我希望这有助于某人…

    这是一台centos机器。转储文件看起来不错,如果我使用phpMyAdmin导入该转储文件,一切都很好。虽然您是对的,但转储文件在表数据中没有任何新行(在
    插入到
    之后,这仅仅是一行。我应该看一些具体的东西吗?嗯。最好的办法是两个数据库之间的字符集差异。如果导出的数据库是utf-8,而您正试图导入到非utf-8数据库中,那么您将很伤心。这也可能是导致需要-r的问题。首先,查看/etc/sysconfig/i18n中的操作系统字符集是什么…尽管如果在转储中没有看到太多的???行,这可能没问题。然后检查两个数据库的字符集,从信息中选择schema_name作为“database”,默认字符_set_name作为“charset”,默认排序规则_name作为“default_collation”;实际上,这两个数据库几乎相同。第一个数据库是创建的,然后复制以获得第二个。其他表中存在一些数据差异,但整个想法是将DB1中的一些表与DB2同步。恐怕我必须排除字符集…检查您的i18n文件…问题可能是两个数据库中都有utf-8,但在编写转储文件时,操作系统无法处理这些问题,因此为什么-r可以工作,但不设置-r会导致错误…您的回答不是我的特定问题的解决方案,但您可能已经走上了正确的道路,这可能会帮助其他处于类似情况的人-感谢您的努力,也许您刚刚解决了某人的问题:)
    
    $import = exec('/usr/bin/mysql -h localhost -u MY_USERNAME -pMY_PASS DATABASE_NAME < /path/to/www/directory/sync/products.sql')