Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的MAMP exec命令在apache env中找不到mysql(在CLI中工作)_Php_Macos - Fatal编程技术网

php中的MAMP exec命令在apache env中找不到mysql(在CLI中工作)

php中的MAMP exec命令在apache env中找不到mysql(在CLI中工作),php,macos,Php,Macos,我使用的是MAMP pro最新版本的Mac OS X 10.10 在cli中,我可以运行以下命令,并且可以正常工作: exec("mysql --host=$db_host --user=$db_user --password=$db_password $db_name < $sql_file"); exec(“mysql--host=$db\u host--user=$db\u user--password=$db\u password$db\u name

我使用的是MAMP pro最新版本的Mac OS X 10.10

在cli中,我可以运行以下命令,并且可以正常工作:

exec("mysql --host=$db_host --user=$db_user --password=$db_password $db_name < $sql_file"); 
exec(“mysql--host=$db\u host--user=$db\u user--password=$db\u password$db\u name<$sql\u file”);
在apache/php中,它不工作,无法找到可执行文件

如果我执行以下操作,它确实可以从apache/php运行:

exec("/Applications/MAMP/Library/bin/mysql --host=$db_host --user=$db_user --password=$db_password $db_name < $sql_file"); 
exec(“/Applications/MAMP/Library/bin/mysql--host=$db_host--user=$db_user--password=$db_password$db_name<$sql_file”);
我需要做什么改变才能让它正常工作?从apache/php运行时,由于某些原因,环境变量似乎不可用。

请参阅php.ini中的“禁用函数”,或尝试函数系统。PHP可能正在调用不同的shell。您可以检查此命令使用的shell:

php -r 'echo shell_exec("echo $0");'

我有两种可能的解决办法。您可以调整程序,也可以切换到PHP方法

Bash方法 根据我有限的经验,OSX非常欣赏MySQL的完整路径。我可能没有完整的故事,所以如果您直接从命令行在bash中测试这个命令,并且它可以工作,那么您最好将代码作为bash脚本插入,您可以执行它

//In your web scripts:
exec("doMySQL $db_host, $db_user, $dp_pass, $db_name $db_file");

//In mysql.php
!/bin/bash
mysql --host=$1 --user=$2 --password=$3 $4 < $5
或者,您可以查看


希望这有帮助

我通过找出环境路径为/usr/bin:/bin:/usr/sbin:/sbin的路径来解决这个问题


我通过phpinfo找到这个。然后我将mysql和mysqldump符号链接到/usr/bin中,这就解决了我的问题。我知道如何为php添加路径;但是这对于我所需要的已经足够了。

如果我给它完整的路径,exec命令就可以工作;但是我需要它在没有给出问题中所述的完整路径的情况下工作。你没有解决你的问题吗?在cli环境中,有一个$PATH环境变量,它是要检查可执行文件的目录列表。在许多上下文中,这是不可用的,您必须显式地包含可执行文件的路径。也许您可以使用
putenv
来设置PATH变量,但我看不出mysql是什么解决方案,因为它是
/Applications/MAMP/Library/bin/mysql
。奇怪的是,它在cli上运行良好,但在apache上运行不好。当我改为system而不是exec时,我没有得到任何输出。我一直认为您的解决方案是解决此问题的可接受的解决方案。为什么不能接受?我希望能够在多个环境中部署它,并基于路径找到mysql。MAMP只是一个开发环境。我一直在阅读,这似乎是apache环境的问题,但我不知道如何为apache设置变量。(修改$PATH)感谢您提供的信息。我使用了multi_查询,以前有过问题。(). 我喜欢直接使用mysql,因为我知道这会有最好的结果。这很公平。你的问题没有提到
存储结果
,这确实很有帮助。如果您正在寻找速度,那么为选项1进行额外的配置是值得的,这样您就可以直接通过mysqli。但是,如果您希望实现终极可移植性,我认为PDO事务可能有助于缓解您的担忧。
$file = file_get_contents($sql_file);
//You may want to take this opportunity to guard against unwanted
// code. For example, if you don't want DELETE syntax. Again, ignore
// if you feel good about your file not being tampered with.
$db = new mysqli($db_host, $db_user, $db_pass, $db_name);

// Now execute the query. Almost verbatim from PHP's documentation:

/* execute multi query */
if ($db->multi_query($file)) {
    do {
        /* store first result set */
        if ($result = $db->store_result()) {
            while ($row = $result->fetch_row()) {
                printf("%s\n", $row[0]);
            }
            $result->free();
        }
        /* print divider */
        if ($mysqli->more_results()) {
            printf("-----------------\n");
        }
    } while ($mysqli->next_result());
}
try {
  $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', 
      array(PDO::ATTR_PERSISTENT => true));
  echo "Connected\n";
} catch (Exception $e) {
  die("Unable to connect: " . $e->getMessage());
}

try {  
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $dbh->beginTransaction();
  foreach(explode(";",$file) as $value) {
      $dbh->exec($value);
  }
  $dbh->commit();
  
} catch (Exception $e) {
  $dbh->rollBack();
  echo "Failed: " . $e->getMessage();
}