ตัวแปรไม่ผ่านเข้าสู่ขั้นตอนการจัดเก็บ

ฉันเป็นมือใหม่จริงๆ ที่ 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%>";
?>

รหัสจะแสดงชื่อแขก, 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

person Adam Loh    schedule 05.02.2015    source แหล่งที่มา


คำตอบ (1)


ลบจุด

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

เปลี่ยนเป็น:

$rs = $mysqli->query( 'CALL FindRoomCost('$guestid', @roomCost);');
person technology101010    schedule 05.02.2015
comment
ใช้งานไม่ได้ มันทำให้ฉันมีข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์แทน - person Adam Loh; 05.02.2015
comment
ลองสิ่งนี้ $rs = $mysqli-›query( 'CALL FindRoomCost('.$guestid.', @roomCost);'); - person technology101010; 06.02.2015
comment
แก้ไขแล้ว ฉันเพิ่งใช้ $mysqli->prepare, bind_param และดำเนินการสำหรับ Stored Procedures ขอบคุณนะ! - person Adam Loh; 06.02.2015