 |
ขอท่านอาจารย์ช่วยแก้ไข 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 :
2485 |
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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|