如何在PHP中以这种方式与提示交互?

如何在PHP中以这种方式与提示交互?,php,exec,Php,Exec,因此,我想通过mysql-uroot-padmin启动一个进程,并在该进程中运行以下语句: C:\>mysql -uroot -padmin Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.0.37-community-nt-log MySQL Community Edition (GPL) Type 'help;' or '

因此,我想通过mysql-uroot-padmin启动一个进程,并在该进程中运行以下语句:

C:\>mysql -uroot -padmin
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.0.37-community-nt-log MySQL Community Edition (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| attendance         |
| fusionchartsdb     |
| mysql              |
| sugarcrm           |
| test               |
+--------------------+
6 rows in set (0.09 sec)

mysql> use mysql;
Database changed
mysql>

如何在PHP中实现这一点?

您可以编写自己的控制台或使用名为PHPMyAdmin的现成控制台。如果您只是想使用web前端与mysql服务器进行交互


尽管写自己的可能很棘手。不幸的是,HTTP服务器不是交互式的。HTTP是无状态协议。因此,您必须找到一种在请求之间保存状态的方法。解决方案之一是使用持久连接。但由于目标不明确,很难给出任何确定的建议。

我不认为我完全理解你的问题

如果您试图在PHP中执行MySQL中的语句,可以使用

如果您只想通过命令行执行一系列命令,可以使用

 show databases
 use mysql
 insert xxx (..) values (..)
如果你想用PHP编写自己的MySQL命令行工具的交互式替代品,你需要大量的时间和毅力。从阅读PHP的CLI开始:

MySQL客户端使用该库,PHP也可以使用该库

PHP的PEAR命令行应用程序在您以类似方式运行PEAR安装过程交互命令行输入时调用,但不使用完整的readline库。有一些问题。关键行是$line=fgetsSTDIN,2048

您可以通过


棘手的部分是从$pipes[0]和$pipes[2]解析另一个进程的输出,并对所有可能的情况做出反应,包括错误处理。你可能想看看这个问题的答案。

以上只是我想做的一个简单例子,但本质是一样的。假设我真正想做的事情与MySQL无关。所以这种黑客行为是行不通的。@user198729它不是交互式的,但关键的困难是如何坚持一个进程并获取其输入和输出流?答案很简单:HTTPuh是不可能的哦,多么令人沮丧。好吧,如果你说的是PHP的CLI版本,为什么不使用mysql控制台本身的CLI版本呢?说我实际上想做的与mysql无关。那么问题是什么?@Shrapnel上校,提问的好方法是简单/简短,同时保留要点。不,这是错误的提问方式。即使简化了,问题也必须是合理的。你是说expect可以用来解析$pipes[0]和$pipes[1],还是说借助expect,我甚至不用麻烦使用proc_open?我很久以前就听说过expect,但现在还不知道如何开始使用它:你是说另一个进程使用$cmd吗?对不起,我不理解最后一条评论。你说棘手的部分是解析另一个进程的输出,这里你是指另一个进程的$cmd吗?
`mysql -u root -p admin --execute "show databases; use mysql; insert ...."`
$bin = 'path/to/mysql.exe';
$cmd = $bin . ' -ulocalonly';
$descriptors = array(
  0 => array('pipe', 'r'), 
  1 => array('pipe', 'w'),
  2 => array('pipe', 'r')
);

$process=proc_open($cmd, $descriptors, $pipes, dirname($bin));
if (is_resource($process)) {
  // ....

}