【问题标题】:Variable not passing into stored procedure变量未传递到存储过程
【发布时间】:2015-04-05 16:27:49
【问题描述】:

我是 php 的绝对初学者,并且对 sql 没问题。因此,对于混乱的编码,我们深表歉意。

我目前正在尝试将包含值“0004”的数据类型 VARCHAR(4) 的变量传递到我在 mysql 上创建的存储过程中。代码如下:

<html>
<head><title> AmountDue </title><head>
<body>

<h1> Amount Due </h1>


<?php
$guestid = "0004";
$mysqli = new mysqli('host', 'username', 'pass', 'schemaname');



$rs = $mysqli->query( 'CALL FindRoomCost('.$guestid.', @roomCost);');
$rs = $mysqli->query( 'CALL FindFoodCost('.$guestid.', @foodCost);');
$rs = $mysqli->query( 'CALL FindSpaCost('.$guestid.', @spaCost);');
$rs = $mysqli->query( 'SELECT gu.guest_id, bi.invoice_no, gu.first_name,
                       gu.last_name, @roomCost + @foodCost + @spaCost AS
                       TotalCost FROM guest gu, bill bi
                       WHERE gu.guest_id = bi.guest_no
                       AND gu.guest_id = '.$guestid.';' );      

print "<table border=1>";
print "<TR><TH>GuestID</TH><TH>InvoiceNumber</TH><TH>FirstName</TH<TH>LastName</TH><TH>TotalCost</TH></TR>";


while ($r2 = mysqli_fetch_row($rs)) {
  print "<tr>"; 
  for ($k=0; $k<count($r2); $k++){  
    print "<td>" . htmlspecialchars($r2[$k]) . "</td>"; 
  } 
  print "</tr>";    
}
print "</table>";
print "<HR width=85%>";
?>

代码成功显示与请求的 guestid 相关联的客人姓名、ID、发票号。但是,它不会调用我想要的存储过程。虽然如果我在过程的参数中手动输入“0004”而不是 $guestid,存储过程将成功运行并给我 TotalCost,这是我想要的结果。我知道我的存储过程没有任何问题,但我会发布它以防万一。任何帮助将不胜感激。

查找房间费用

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `FindRoomCost`
(
IN guestTag VARCHAR(4),
OUT roomCost INT
)
BEGIN

SELECT
(DATEDIFF(res.check_out_date, res.check_in_date))*(count(DISTINCT(ro.room_id)) * (ro.room_rate))
INTO roomCost 
FROM room ro, reservation res
WHERE ro.guest_number = res.guest_id
AND ro.guest_number = guestTag;

END

查找食品成本

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `FindFoodCost`
(
IN guestTag VARCHAR(4),
OUT foodCost INT
)
BEGIN

SELECT CASE
WHEN nrc.invoice_no IN (bi.invoice_no)
    THEN SUM(DISTINCT(nrc.quantity * sm.menu_price))
    ELSE 0
END
INTO foodCost
FROM bill bi, non_room_charge nrc, set_menu sm
WHERE bi.invoice_no = nrc.invoice_no
AND nrc.menu_no = sm.menu_id
AND bi.guest_no = guestTag;

END

查找水疗费用

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `FindSpaCost`
(
IN guestTag VARCHAR(4),
OUT spaCost INT
)
BEGIN

SELECT CASE
WHEN nrc.invoice_no IN (bi.invoice_no)
    THEN SUM(DISTINCT(nrc.quantity * sp.spa_price))
    ELSE 0
END
INTO spaCost
FROM bill bi, non_room_charge nrc, spa_package sp
WHERE bi.invoice_no = nrc.invoice_no
AND nrc.spa_no = sp.spa_id
AND bi.guest_no = guestTag;

END

【问题讨论】:

    标签: php stored-procedures mysql-workbench


    【解决方案1】:

    删除句点。

    $rs = $mysqli->query( 'CALL FindRoomCost('.$guestid.', @roomCost);');
    

    更改为:

    $rs = $mysqli->query( 'CALL FindRoomCost('$guestid', @roomCost);');
    

    【讨论】:

    • 不起作用。相反,它给了我一个解析错误:语法错误。
    • 试试这个。 $rs = $mysqli->query('CALL FindRoomCost("'.$guestid.'", @roomCost);');
    • 已解决。我只是使用了 $mysqli->prepare、bind_param 并执行存储过程。还是谢谢!
    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多