【问题标题】:Excute a MySQL script from within a PHP script?从 PHP 脚本中执行 MySQL 脚本?
【发布时间】:2023-05-14 07:07:02
【问题描述】:

你能在 PHP 脚本 (bar.php) 中执行 MySQL 脚本 (foo.sql) 吗?如果是这样,怎么做?

而且,这是推荐还是不推荐的做法,为什么还是不推荐?

提前致谢。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    mysqli::multi_query 是另一种选择。

    【讨论】:

    • 是的,它也将与 Turbo Pascal 不兼容。你是仍然会关心的小人物之一吗?
    【解决方案2】:

    怎么做?

    bar.php:

    <?php `mysql < foo.sql`;
    

    Execution OperatorsDocsUsing mysql in Batch ModeDocs

    这是推荐的 [...] 做法,为什么 [...] ?

    始终建议为工作选择合适的工具。 mysql 命令行界面非常强大、快速且经过良好测试。它可以满足您的需求。

    相关: Loading .sql files from within PHPBest practice: Import mySQL file in PHP; split queries

    【讨论】:

    • 滴答声是否等同于运行命令行可执行文件? 注意,我不知道。
    • @Jared Farrish:是的。就像在 shell 脚本中一样,比较:Execution Operators.
    • 感谢您的回复。在 PHP 中使用反引号(将其内容作为 shell 命令执行)假定 php.ini 允许它,即 shell_exec 已启用。在这种情况下,我不能假设。另外,您是否不必登录到 mysql 客户端才能从 php 脚本甚至命令行中调用它?
    • @Rylie:该命令支持用户名和密码,我已经链接了文档,都在里面。如果shell_exec 被禁用,反引号将不起作用。
    • @Rylie:如果反引号不可用,你不能这样做。如果您不能说,您需要检查shell_exec 是否可用,并通知用户此功能不可用和/或提供解决方法。看看这里的其他答案,我认为 PHPMyAdmin 和类似工具中应该有代码可以做你想做的事。另请参阅:Loading .sql files from within PHP
    【解决方案3】:
    $contents = get_file_contents( 'foo.sql' );
    $queries = explode( ';', $contents );
    foreach( $queries as $query ) {
         mysql_query( $query );
    }
    

    我不认为这样做有什么问题。

    【讨论】:

    • 好吧,包含; 的插入语句或cmets 将使它无用。
    • @hakre 是的,你是对的,包含; 的字符串也会造成问题,也许我们可以用preg_split() 处理这个问题
    • 不要尝试改进你的脚本。除非您编写一个成熟的 MYSQL 语言 SQL 解析器,否则您将失败,但没有必要,CLI 客户端已经有了它。或者,PHPMyAdmin 代码可能有这样的。
    • @harke 你可能是对的,实际上我没有时间编写正则表达式来尝试这个,但是如果一个人没有访问 mysql 可执行文件(例如 php 安全模式)这个可能是唯一的选择。
    • 不是唯一的选项,总是有另一个选项可以访问 mysql 可执行文件。不要用代码解决你可以用配置解决的问题。
    最近更新 更多