2015-02-05 37 views
0

我是一个绝对的初学者在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。我知道我的存储过程没有问题,但我只是将其发布以防万一。任何帮助将不胜感激。

FindRoomCost

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 

FindFoodCost

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 

FindSpaCost

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 

回答

1

取出周期。

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

更改为:

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

不工作。它反而给我一个解析错误:语法错误。 – 2015-02-05 20:31:05

+0

试试这个。 $ rs = $ mysqli-> query('CALL FindRoomCost(''。$ guestid。'“,@roomCost);'); – technology101010 2015-02-05 21:05:37

+0

解决。我只是使用$ mysqli-> prepare,bind_param和执行存储过程。不管怎么说,还是要谢谢你! – 2015-02-06 06:32:53