【发布时间】:2011-02-20 06:00:39
【问题描述】:
我希望能够使用 phpMyAdmin 创建存储过程,然后通过 php 使用它。
但我不知道怎么做?
据我所知,我发现我们无法通过phpMyAdmin管理存储过程。
还有什么工具可以管理存储过程?
我什至不确定通过 PHP 使用存储过程是否是更好的选择。 有什么建议吗?
【问题讨论】:
标签: php stored-procedures mysql phpmyadmin
我希望能够使用 phpMyAdmin 创建存储过程,然后通过 php 使用它。
据我所知,我发现我们无法通过phpMyAdmin管理存储过程。
还有什么工具可以管理存储过程?
我什至不确定通过 PHP 使用存储过程是否是更好的选择。 有什么建议吗?
【问题讨论】:
标签: php stored-procedures mysql phpmyadmin
由于使用查询创建、更改和删除存储过程,您实际上可以使用 phpMyAdmin 管理它们。
要创建存储过程,您可以使用以下内容(根据需要进行更改):
CREATE PROCEDURE sp_test()
BEGIN
SELECT 'Number of records: ', count(*) from test;
END//
并确保将 SQL 选项卡上的“分隔符”字段设置为 //。
一旦您创建了存储过程,它将出现在表格下方的例程字段集中(在“结构”选项卡中),您可以轻松更改/删除它。
要使用 PHP 中的存储过程,您必须执行 CALL 查询,就像使用普通 SQL 一样。
【讨论】:
我想没有人提到这一点,所以我会在这里写下来。在 phpMyAdmin 4.x 中,在顶行的“例程”选项卡下有“添加例程”链接。此链接会打开一个弹出对话框,您可以在其中编写存储过程而无需担心分隔符或模板。
添加例程
请注意,对于简单的测试存储过程,您可能希望删除已经给出的默认参数,或者您可以简单地设置一个值。
【讨论】:
试试这个
delimiter ;;
drop procedure if exists test2;;
create procedure test2()
begin
select ‘Hello World’;
end
;;
【讨论】:
;;作为分隔符与用于语句的;太相似了,所以为了清楚起见使用//分隔符更有意义。
试用 Toad for MySQL - 免费且很棒。
【讨论】:
我让它在 phpAdmin 中工作,但只有当我删除“记录数”短语时。
在我的 phpAdmin 版本中,我可以看到用于更改分隔符的框。
还要查看数据库中的程序,我去了 phpAdmin 主页,然后是 information_schema 数据库,然后是例程表。
【讨论】:
新版本的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 提供了一个很好的解决方案,假设您有命令行访问权限。如果不这样做,不知道如何解决。
【讨论】:
【讨论】:
以上所有答案都是做出某些假设。 1and1 存在基本问题,某些其他托管服务提供商正在使用非常旧的 phpMyAdmin 版本,并且存在定义分隔符的问题;并且无法从 phpMyAdmin 更改它。以下是方法
希望对你有帮助
【讨论】:
/*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$$
【讨论】:
在本地服务器上,您的以下查询将起作用
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;
【讨论】: