ขอท่านอาจารย์ช่วยแก้ไข error ให้หน่อยค่ะ php pdo มือใหม่ค่ะอยากพัฒนาตัวเอง
หนูว่าหนูประกาศครบหมดแล้วนะคะ ไม่รู้พลาดตรงไหน
หนูใช้ฐานข้อมูล 2 ตารางค่ะ โดยให้ตรวจสอบว่าถ้าข้อมูลซ้ำให้ขึ้น error แต่ถ้าข้อมูลไม่ซ้ำให้บันทึกลงในตาราง bookout_2565
ซ้ำการทำงานเช็คข้อมูลซ้ำทำงานได้ปกติดีค่ะ แต่ถ้าข้อมูลไม่ซ้ำ มันไม่ยอมบันทึกลงตาราง bookout_2565 ให้แต่จะขึ้นจอขาวก็จะมี error แบบนี้ค่ะ
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\xampp\htdocs\bookout65\aformAdd_db.php:67 Stack trace: #0 C:\xampp\htdocs\bookout65\aformAdd_db.php(67): PDOStatement->execute() #1 {main} thrown in C:\xampp\htdocs\bookout65\aformAdd_db.php on line 67
อันนี้คือหน้า aformAdd.php ซึ่งประกาศตัวแปรงไว้ดังนี้ค่ะ
Code (PHP)
<form action="aformAdd_db.php" method="post">
<div class="mb-2 row">
<div class="col-sm-12">
<select name="type_id" class="form-control" required>
<option value="">-เลือกประเภทหนังสือ-</option>
<?php
$stmt = $conn->prepare("SELECT* FROM typebook");
$stmt->execute();
$result = $stmt->fetchAll();
foreach($result as $row) {
?>
<option value="<?= $row['type_id'];?>">-<?= $row['t_name'];?></option>
<?php } ?>
</select>
</div></div>
<div class="mb-2 row">
<div class="col-sm-3">
<input type="text" name="Numberbk" pattern="[0-9]{1,}" title="กรอกตัวเลขเท่านั้น" class="form-control" required maxlength="5" placeholder="เลขที่หนังสือออก">
</div>
<!-- </div>
<div class="mb-2"> -->
<div class="col-sm-3">
<input type="text" name="Yearbk" class="form-control" readonly="readonly" value="<?php echo thaidate('/Y'); ?>">
</div>
<div class="col-sm-6">
<input type="text" name="datebk" class="form-control" readonly="readonly" value="<?php echo thaidate('j F Y'); ?>">
</div>
</div>
<div class="mb-2 row">
<div class="col-sm-12">
<input type="text" name="Sudbk" class="form-control" required maxlength="100" placeholder="เรื่อง">
</div>
</div>
<div class="mb-2 row">
<div class="col-sm-6">
<input type="text" name="NameFrom" class="form-control" required maxlength="50" placeholder="ชื่อผู้ส่ง">
</div>
<div class="col-sm-6">
<input type="text" name="NameTo" class="form-control" required maxlength="50" placeholder="ผู้รับ (ชื่อบุคคล/หน่วยงาน)">
</div>
</div>
<div class="mb-2 row">
<div class="col-sm-3">
<input type="text" name="posFrom" class="form-control" required maxlength="50" placeholder="แผนก/สังกัด">
</div>
<div class="col-sm-3">
<input type="text" name="phonefrom" class="form-control" maxlength="4" placeholder="เบอร์ติดต่อภายใน">
</div>
<div class="col-sm-6">
<input type="text" name="phoneto" class="form-control" maxlength="20" placeholder="เบอร์โทรบุคคล/หน่วยงาน(ที่รับ)">
</div>
</div>
<div class="mb-2 row">
<div class="col-sm-6">
<input type="text" name="nameby" class="form-control" required maxlength="10" placeholder="ชื่อผู้ขอเลข">
</div>
</div>
</div>
<div class="mb-2 row">
<div class="d-grid gap-2 col-sm-12 mb-3">
<button type="submit" class="btn btn-primary">เพิ่มข้อมูล</button>
</div>
</div>
</form>
<h5>รายชื่อพนักงาน</h5>
<table class="table table-striped table-hover table-responsive table-bordered">
<thead>
<tr>
<th width="5%">ลำดับ</th>
<th width="25%">หนังสือ</th>
<th width="25%">เลขที่</th>
<th width="25%">ผู้ส่ง</th>
<th width="20%">วันที่ขอ</th>
</tr>
</thead>
<tbody>
<?php
$stmtEmp = $conn->prepare("SELECT b.*, t.t_name FROM bookout_2565 AS b INNER JOIN typebook AS t ON b.Typebk=t.type_id ORDER BY b.bookID DESC");
$stmtEmp->execute();
$resultEmp = $stmtEmp->fetchAll();
foreach($resultEmp as $rowEmp) {
?>
<tr>
<td><?= $rowEmp['bookID'];?></td>
<td><?= $rowEmp['t_name'];?></td>
<td><?= $rowEmp['Numberbk'];?><?= $rowEmp['Yearbk'];?></td>
<td><?= $rowEmp['NameFrom'];?></td>
<td><?= $rowEmp['datebk'];?></td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>
</div>
อันนี้เป็นหน้าตรวจสอบค่ะหลังเพิ่มข้อมูล aformAdd_db.php
Code (PHP)
<?php
//print_r($_POST);
//exit();
if(isset($_POST['Numberbk']) && isset($_POST['Yearbk']) && isset($_POST['datebk']) && isset($_POST['Sudbk'])
&& isset($_POST['NameFrom']) && isset($_POST['NameTo']) && isset($_POST['posFrom']) && isset($_POST['phonefrom'])
&& isset($_POST['phoneto']) && isset($_POST['nameby']) ){
// sweet alert
echo '
<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert-dev.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.css">';
//ฐานข้อมูล
require_once 'connects/connect.php';
//$bookID = $_POST['bookID'];
$Numberbk = $_POST['Numberbk'];
$Yearbk = $_POST['Yearbk'];
$datebk = $_POST['datebk'];
$Sudbk = $_POST['Sudbk'];
$NameFrom = $_POST['NameFrom'];
$NameTo = $_POST['NameTo'];
$posFrom = $_POST['posFrom'];
$phonefrom = $_POST['phonefrom'];
$phoneto = $_POST['phoneto'];
$nameby = $_POST['nameby'];
//$m_id = $_POST['m_id'];
//check
$stmt = $conn->prepare("SELECT bookID FROM bookout_2565 WHERE Numberbk = :Numberbk");
$stmt->execute(array(':Numberbk' => $Numberbk));
if($stmt->rowCount() > 0){
echo '<script>
setTimeout(function() {
swal({
title: "เลขที่หนังสือออกนี่ถูกใช้ไปแล้ว ",
text: "กรุณาตรวจสอบเลขหนังสือปัจจุบัน",
type: ""
}, function() {
window.location = "aformAdd.php";
});
}, 1000);
</script>';
}else{
//sql insert
$stmt = $conn->prepare("INSERT INTO bookout_2565 (Numberbk, Yearbk, datebk, Sudbk, NameFrom, NameTo, posFrom, phonefrom, phoneto, nameby)
VALUES (:Numberbk, :Yearbk, :datebk, :Sudbk, :NameFrom, :NameTo, :posFrom, :phonefrom, phoneto, :nameby)");
$stmt->bindParam(':Numberbk', $Numberbk , PDO::PARAM_INT);
$stmt->bindParam(':Yearbk', $Yearbk , PDO::PARAM_STR);
$stmt->bindParam(':datebk', $datebk , PDO::PARAM_STR);
$stmt->bindParam(':Sudbk', $Sudbk, PDO::PARAM_STR);
$stmt->bindParam(':NameFrom', $NameFrom , PDO::PARAM_STR);
$stmt->bindParam(':NameTo', $NameTo , PDO::PARAM_STR);
$stmt->bindParam(':posFrom', $posFrom , PDO::PARAM_STR);
$stmt->bindParam(':phonefrom', $phonefrom, PDO::PARAM_STR);
$stmt->bindParam(':phoneto', $phoneto , PDO::PARAM_STR);
$stmt->bindParam(':nameby', $nameby , PDO::PARAM_STR);
//$stmt->bindParam(':m_id', $m_id , PDO::PARAM_INT);
$result = $stmt->execute();
if($result){
echo '<script>
setTimeout(function() {
swal({
title: "เพิ่มข้อมูลสำเร็จ",
type: ""
}, function() {
window.location = "afrom.php";
}, 1000);
</script>';
}else{
echo '<script>
setTimeout(function() {
swal({
title: "เกิดข้อผิดพลาด",
type: "กรุณาตรวจสอบความถูกต้องหรือตรวจสอบว่าท่านกรอกข้อมูลครบทุกช่อง"
}, function() {
window.location = "aformAdd.php";
});
}, 1000);
</script>';
}
}
}
$conn = null;
?>
Tag : PHP, HTML, HTML5, JavaScript, Web Services, XAMPP
Date :
2022-03-13 14:42:01
By :
sunpatoo
View :
2300
Reply :
7
ขาด : ไปตัวนึงหรือเปล่าครับ
Code
//sql insert
$stmt = $conn->prepare("INSERT INTO bookout_2565 (Numberbk, Yearbk, datebk, Sudbk, NameFrom, NameTo, posFrom, phonefrom, phoneto, nameby)
VALUES (:Numberbk, :Yearbk, :datebk, :Sudbk, :NameFrom, :NameTo, :posFrom, :phonefrom, : phoneto, :nameby)");
Date :
2022-03-13 16:36:59
By :
arm8957
query ไม่ต้อง prepare
Code (PHP)
$sql = 'SELECT ... INNER JOIN ...';
$statement = $pdo->query($sql);
Date :
2022-03-13 16:42:43
By :
009
การใช้ prepare จะใช้เมื่อมีการ อ้างอิงตัวแปรจาก การ request เพื่อทำการ escape ตัวแปรนั้นๆ
ถ้าเป็น hard code หรือ constant ที่ไม่มีการนำ ตัวแปร request มาใช้ ก็ไม่จำเป็นต้องใช้ prepare
ใช้คำสั่ง query ตรงๆ เลยก็ได้
ที่นี้ จาก error message
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in
แก้ไข
จำนวน ของ parameter ไม่ตรงกับ ที่อ้างอิงใน sql_statement
เช็ค ชื่อ field ให้ดีครับ
ประวัติการแก้ไข 2022-03-13 19:11:30
Date :
2022-03-13 17:09:03
By :
Chaidhanan
นอกเรื่องนิด... ในรูป เอาอะไรไปครอบหัวน่ะ
Date :
2022-03-13 18:15:28
By :
mr.v
ตอบกระทู้
ปัญหานี้เจ้าของกระทู้เคยเจอมาก่อนแล้วเป๊ะๆเลยนะ เมื่อปลายปีที่แล้วหรือ 3 เดือนก่อนนี้เอง
https://www.thaicreate.com/php/forum/136541.html
แล้วผมก็แจกเครื่องมือช่วยงานไปให้แล้วด้วย อีกทั้งมีคนชี้จุดบกพร่องแล้วด้วย
เอาเครื่องมือไปใช้ให้เป็นประโยชน์สิครับ
Date :
2022-03-13 18:18:29
By :
mr.v
สอบถามเพิ่มเติมค่ะ อยากทำ INNER JOIN 3 ตาราง เขียนแบบนี้ถูกต้องมั้ยคะ
Code (PHP)
("SELECT b.*, t.t_name, u.* FROM bookout_2565 AS b INNER JOIN typebook AS t
ON b.Typebk=t.type_id INNER JOIN user_emp AS u
ON b.m_id=u.m_id ORDER BY b.bookID DESC ");
Date :
2022-03-18 14:16:24
By :
sunpatoo
ถูกหรือไม่ลองดูก็ได้ครับ ถุ้ามีเออเร่อร์ ก็ไม่ถูก 55555
Code (SQL)
SELECT b.*, t.t_name, u.* #select clause
FROM bookout_2565 AS b #from clause
INNER JOIN typebook AS t ON b.Typebk=t.type_id #join clause
INNER JOIN user_emp AS u ON b.m_id=u.m_id #join clause
ORDER BY b.bookID DESC #order clause
มือใหม่เขียน แบ่งวรรคตอน จะได้อ่านแล้วเข้าใจง่ายครับ
หรือเขียนแบบนี้
Code (SQL)
SELECT b.*, t.t_name, u.*
FROM
bookout_2565 AS b,
typebook AS t ,
user_emp AS u
where
b.Typebk=t.type_id
and b.m_id=u.m_id
ORDER BY b.bookID DESC
Date :
2022-03-21 13:12:02
By :
Chaidhanan
Load balance : Server 03