Wim*_*rke 2 php mysql mysqli procedure
DROP PROCEDURE IF EXISTS `XofferCommon`.`getCdpc`;<br>
DELIMITER $$<br>
CREATE PROCEDURE `XofferCommon`.`getCdpc` (IN in_city_ID INT, OUT out_country_id INT, OUT out_district_id INT, OUT out_provence_id INT, OUT out_city_id INT)<br>
BEGIN<br>
DECLARE city_ID INT DEFAULT in_city_ID;<br>
SELECT t.Id, d.Id, p.Id, c.Id INTO out_country_id, out_district_id, out_provence_id, out_city_id FROM ((tblCity AS c INNER JOIN tblProvence AS p ON c.tblProvence_Id = p.ID) INNER JOIN tblDistrict AS d ON p.tblDistrict_Id = d.ID) INNER JOIN tblCountry AS t ON -d.tblCountry_Id = t.ID WHERE c.id = city_ID;<br>
END$$<br>
DELIMITER ;<br><br>
<br>---------------------------------------------------
Input: int referring to in_city_id<br>
Output: 4 x int country district provence and city id's<br>
---------------------------------------------------<br>
Run Code Online (Sandbox Code Playgroud)
Php:我想调用该过程并将4个返回的对象存储到4个变量中
if ($res = $mysqli->query( 'CALL getCdpc(1321,@co,@di,@pr,@ci);SELECT @co,@di,@pr,@ci'))<br>
{<br>
while($row = $res->fetch_object())<br>
{<br>
print($row);<br>
}<br>
$res->close();<br>
}<br>
else<br>
{<br>
print "<br> no result given <br>";<br>
}<br>
<br>
Result:<br>
-------<br>
Run Code Online (Sandbox Code Playgroud)
我总是得到零排
<br>
<br>
More info:<br>
----------<br>
in mysql sql the results get returned when I do:<br>
->call xoffercommon.getCdpc(1321,@co,@di,@pr,@ci);<br>
->select @co,@di,@pr,@ci;<br>
=> @co @di @pr @ci<br>
1 2 3 4<br>
<br>
Question:<br>
---------<br>
Run Code Online (Sandbox Code Playgroud)
我是否必须运行2个查询,调用该过程并对该结果进行选择?
有没有办法在一行中运行它?
...请帮助我无处找到我的问题的解决方案,已经尝试在程序中返回,但这只能在函数中使用.已经2周了...通过阅读/试错了解了很多;-),但没有破解这个案例......
当你只需返回一个结果集时,不确定为什么要传递4个变量.这也可以避免每次要扩展输出数据时都必须更改sproc接口.
drop procedure if exists XofferCommon.getCdpc;
delimiter #
create procedure XofferCommon.getCdpc
(
in p_city_id int unsigned
)
begin
select
t.Id as country_id,
d.Id as district_id,
p.Id as provence_id,
c.Id as city_id
from
tblCity c
inner join tblProvence p on c.tblProvence_Id = p.Id
inner join tblDistrict d on p.tblDistrict_Id = d.Id
inner join tblCountry t on d.tblCountry_Id = t.Id
where
c.Id = p_city_id;
end#
delimiter ;
Run Code Online (Sandbox Code Playgroud)
<?php
ob_start();
try
{
$db = new mysqli("localhost", "foo_dbo", "pass", "foo_db", 3306);
if ($db->connect_errno)
throw new exception(sprintf("Could not connect: %s", $db->connect_error));
$sqlCmd = sprintf("call getCdpc(%d)", 1);
$result = $db->query($sqlCmd);
if(!$result) throw new exception(sprintf("Invalid query : %s", $sqlCmd));
if($result->num_rows <= 0){
echo "no records found !";
}
else{
$row = $result->fetch_assoc();
echo sprintf("country_id = %d district_id = %d, provence_id = %d, city_id = %d",
$row["country_id"],$row["district_id"],$row["provence_id"],$row["city_id"]);
}
$db->next_result();
$result->close();
}
catch(exception $ex)
{
ob_clean();
echo sprintf("zomg borked - %s", $ex->getMessage());
}
if(!$db->connect_errno) $db->close();
ob_end_flush();
?>
Run Code Online (Sandbox Code Playgroud)
清理模式也是值得的,这样你就可以为键提供更合适的整数数据类型(并非所有内容都是4字节的有符号整数),并避免混合使用你似乎为同一事物选择的字段名,即Id,ID ,City_Id,City_ID等将避免所有不必要的别名!
http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html
drop table if exists country;
create table country
(
country_id tinyint unsigned not null auto_increment primary key -- 0 to 255 countries;
)
engine=innodb;
drop table if exists district;
create table district
(
district_id smallint unsigned not null auto_increment primary key, -- 0 to 65535 districts
country_id tinyint unsigned not null
)
engine=innodb;
drop table if exists provence;
create table provence
(
provence_id smallint unsigned not null auto_increment primary key, - 0 to 65535 provences
district_id smallint unsigned not null
)
engine=innodb;
drop table if exists city;
create table city
(
city_id mediumint unsigned not null auto_increment primary key, - 0 to 16777215 cities
provence_id smallint unsigned not null
)
engine=innodb;
Run Code Online (Sandbox Code Playgroud)
drop procedure if exists getCdpc;
delimiter #
create procedure getCdpc
(
in p_city_id mediumint unsigned
)
begin
select
t.country_id,
d.district_id,
p.provence_id,
c.city_id
from
city c
inner join provence p on c.provence_id = p.provence_id
inner join district d on p.district_id = d.district_id
inner join country t on d.country_id = t.country_id
where
c.city_id = p_city_id;
end#
delimiter ;
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 :)
| 归档时间: |
|
| 查看次数: |
2697 次 |
| 最近记录: |