【问题标题】:How to write a stored procedure using phpmyadmin and how to use it through php?如何使用phpmyadmin编写存储过程以及如何通过php使用?
【发布时间】:2011-02-20 06:00:39
【问题描述】:

我希望能够使用 phpMyAdmin 创建存储过程,然后通过 php 使用它。

但我不知道怎么做?

据我所知,我发现我们无法通过phpMyAdmin管理存储过程。

还有什么工具可以管理存储过程?

我什至不确定通过 PHP 使用存储过程是否是更好的选择。 有什么建议吗?

【问题讨论】:

    标签: php stored-procedures mysql phpmyadmin


    【解决方案1】:

    由于使用查询创建、更改和删除存储过程,您实际上可以使用 phpMyAdmin 管理它们。

    要创建存储过程,您可以使用以下内容(根据需要进行更改):

    CREATE PROCEDURE sp_test()
    BEGIN
      SELECT 'Number of records: ', count(*) from test;
    END//
    

    并确保将 SQL 选项卡上的“分隔符”字段设置为 //。

    一旦您创建了存储过程,它将出现在表格下方的例程字段集中(在“结构”选项卡中),您可以轻松更改/删除它。

    要使用 PHP 中的存储过程,您必须执行 CALL 查询,就像使用普通 SQL 一样。

    【讨论】:

    • 我不敢相信我错过了这个......它有效......那么好吧......现在你能指导我,一个开始学习存储过程的地方......
    • 我使用 PHP 2.8.2.4 - 任何地方都没有“分隔符”字段! ??
    • @VassilisGr:那你可能会考虑升级 phpMyAdmin,2.11.8.1 肯定有...
    • 当我从 phpmyadmin 调用我的存储过程时,它不会返回任何内容,当我在例程中执行它时它可以工作,并且当我从 java、php 和其他人调用它时也可以工作。
    • 在 3.4.10.1deb 上无法通过“SQL”选项卡直接写入文本框。强制放置标签“分隔符;;”和 ”;;”在开始/结束(;; 可以是 // 也可以是我认为的任何东西)
    【解决方案2】:

    我想没有人提到这一点,所以我会在这里写下来。在 phpMyAdmin 4.x 中,在顶行的“例程”选项卡下有“添加例程”链接。此链接会打开一个弹出对话框,您可以在其中编写存储过程而无需担心分隔符或模板。

    添加例程

    请注意,对于简单的测试存储过程,您可能希望删除已经给出的默认参数,或者您可以简单地设置一个值。

    【讨论】:

    • 要查看该选项卡,您必须在 phpMyAdmin 的配置文件中启用 mysqli。
    • 我想补充一点,this StackOverflow answer 描述了如何在 phpmyadmin 中使用例程
    【解决方案3】:

    试试这个

    delimiter ;;
    
    drop procedure if exists test2;;
    
    create procedure test2()
    
    begin
    
    select ‘Hello World’;
    
    end
    
    ;;
    

    【讨论】:

    • 感谢您的帮助,但您的回答与@wimvds 的回答相似
    • 对我来说也是。为了让它工作,我应该设置分隔符。
    • 投票,因为它适用于 3.4.10.1deb(在“SQL”选项卡下)
    • 我个人认为使用;;作为分隔符与用于语句的;太相似了,所以为了清楚起见使用//分隔符更有意义。
    【解决方案4】:

    试用 Toad for MySQL - 免费且很棒。

    【讨论】:

    • 我想试试 Toad。它看起来很有希望。
    【解决方案5】:

    我让它在 phpAdmin 中工作,但只有当我删除“记录数”短语时。

    在我的 phpAdmin 版本中,我可以看到用于更改分隔符的框。

    还要查看数据库中的程序,我去了 phpAdmin 主页,然后是 information_schema 数据库,然后是例程表。

    【讨论】:

      【解决方案6】:

      新版本的phpMyAdmin(3.5.1)对存储过程的支持更好;包括:编辑、执行、导出、PHP代码创建和一些调试。

      确保您使用的是 config.inc.php 中的 mysqli 扩展

      $cfg['Servers'][$i]['extension'] = 'mysqli';
      

      打开任何数据库,您会在顶部看到一个名为 Routines 的新标签,然后选择 Add Routine

      我做的第一个测试产生了以下错误信息:

      MySQL 说:#1558 - mysql.proc 的列数错误。预期 20,实际 16。使用 MySQL 50141 创建,现在运行 50163。请使用 mysql_upgrade 修复此错误。

      Ciuly's Blog 提供了一个很好的解决方案,假设您有命令行访问权限。如果不这样做,不知道如何解决。

      【讨论】:

        【解决方案7】:
        1. 分隔符;;
        2. 创建过程 sp_number_example_records()
        3. 开始
          从客户中选择计数(id); 结束
        4. ;;

        【讨论】:

          【解决方案8】:

          以上所有答案都是做出某些假设。 1and1 存在基本问题,某些其他托管服务提供商正在使用非常旧的 phpMyAdmin 版本,并且存在定义分隔符的问题;并且无法从 phpMyAdmin 更改它。以下是方法

          1. 在托管服务提供商上创建一个新的 PHPMyAdmin。附加链接给你想法http://internetbandaid.com/2009/04/05/install-phpmyadmin-on-1and1/
          2. 通过复杂的途径从您的桌面访问您的托管服务提供商 mySQL。这很复杂,但如果您是认真的开发人员,那是最好的。这是一个链接http://franklinstrube.com/blog/remote-mysql-administration-for-1and1/

          希望对你有帮助

          【讨论】:

            【解决方案9】:
            /*what is wrong with the following?*/
            DELIMITER $$
            
            CREATE PROCEDURE GetStatusDescr(
                in  pStatus char(1), 
                out pStatusDescr  char(10))
            BEGIN 
                IF (pStatus == 'Y THEN
             SET pStatusDescr = 'Active';
                ELSEIF (pStatus == 'N') THEN
                    SET pStatusDescr = 'In-Active';
                ELSE
                    SET pStatusDescr = 'Unknown';
                END IF;
            
            END$$
            

            【讨论】:

              【解决方案10】:

              在本地服务器上,您的以下查询将起作用

              DELIMITER |
              
              CREATE PROCEDURE sample_sp_with_params (IN empId INT UNSIGNED, OUT oldName VARCHAR(20), INOUT newName VARCHAR(20))
              
              BEGIN
              
              SELECT `first name` into oldName FROM emp where id = empId;
              
              UPDATE emp SET `first name`= newName where id = empId;
              
              END
              
              |
              
              DELIMITER ;
              

              但在生产服务器上它可能无法正常工作。取决于您使用的 mysql 版本。我在 powweb 服务器上遇到了同样的问题,我删除了分隔符并开始关键字,它工作正常。 看看下面的查询

              CREATE PROCEDURE adminsections( IN adminId INT UNSIGNED ) SELECT tbl_adminusersection.ads_name, tbl_adminusersection.ads_controller FROM tbl_adminusersectionright LEFT JOIN tbl_adminusersection ON ( tbl_adminusersectionright.adsr_ads_id = tbl_adminusersection.ads_id ) LEFT JOIN tbl_adminusers ON ( tbl_adminusersectionright.adsr_adusr_id = tbl_adminusers.admusr_id ) WHERE tbl_adminusers.admusr_id = adminId;
              

              【讨论】:

                猜你喜欢
                • 2018-09-24
                • 2013-07-03
                • 2012-07-21
                • 1970-01-01
                • 2011-02-12
                • 2016-05-12
                • 2018-01-29
                • 2018-12-28
                • 2013-03-31
                相关资源
                最近更新 更多