mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows ฯลฯ ... คาดว่าพารามิเตอร์ 1 จะเป็นทรัพยากร
ฉันพยายามเลือกข้อมูลจากตาราง MySQL แต่ได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
mysql_fetch_array () คาดว่าพารามิเตอร์ 1 จะเป็นรีซอร์สโดยให้บูลีน
นี่คือรหัสของฉัน:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
while($row = mysql_fetch_array($result)) {
echo $row['FirstName'];
}
คำตอบ
แบบสอบถามอาจล้มเหลวด้วยเหตุผลหลายประการซึ่งในกรณีนี้ทั้ง mysql_ * และส่วนขยาย mysqli จะส่งคืนfalse
จากฟังก์ชัน / วิธีการสืบค้นตามลำดับ คุณต้องทดสอบเงื่อนไขข้อผิดพลาดนั้นและจัดการตามนั้น
mysql_ * นามสกุล :
หมายเหตุฟังก์ชั่น mysql_ จะเลิกและได้ถูกลบออกใน PHP รุ่น 7
ตรวจสอบ$result
ก่อนส่งต่อไปmysql_fetch_array
. คุณจะพบว่าเป็นfalse
เพราะการสืบค้นล้มเหลว ดูmysql_queryเอกสารสำหรับค่าส่งคืนที่เป็นไปได้และคำแนะนำสำหรับวิธีจัดการกับค่าเหล่านี้
$username = mysql_real_escape_string($_POST['username']); $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) {
die(mysql_error()); // TODO: better error handling
}
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
รูปแบบขั้นตอนการขยาย mysqli :
$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'"); // mysqli_query returns false if something went wrong with the query if($result === FALSE) {
yourErrorHandler(mysqli_error($mysqli)); } else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) {
...
สไตล์ oo :
$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) {
yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
ใช้คำสั่งที่เตรียมไว้:
$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) { yourErrorHandler($mysqli->error); // or $mysqli->error_list } else if ( !$stmt->bind_param('s', $_POST['username']) ) { yourErrorHandler($stmt->error); // or $stmt->error_list } else if ( !$stmt->execute() ) {
yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
$result = $stmt->get_result();
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
ตัวอย่างเหล่านี้แสดงให้เห็นเฉพาะสิ่งที่ควรทำ (การจัดการข้อผิดพลาด) ไม่ใช่วิธีการทำ ไม่ควรใช้รหัสการผลิตor dieเมื่อส่งออก HTML มิฉะนั้น (อย่างน้อยที่สุด) จะสร้าง HTML ที่ไม่ถูกต้อง นอกจากนี้ยังมีข้อความผิดพลาดฐานข้อมูลไม่ควรที่จะแสดงให้ผู้ใช้ไม่ใช่ผู้ดูแลระบบเป็นมันเปิดเผยข้อมูลมากเกินไป
ข้อความแสดงข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อคุณมีข้อผิดพลาดในแบบสอบถามของคุณซึ่งทำให้ล้มเหลว มันจะปรากฏขึ้นเมื่อใช้:
mysql_fetch_array
/mysqli_fetch_array()
mysql_fetch_assoc()
/mysqli_fetch_assoc()
mysql_num_rows()
/mysqli_num_rows()
หมายเหตุ : ข้อผิดพลาดนี้จะไม่ปรากฏขึ้นหากไม่มีแถวที่ได้รับผลกระทบจากข้อความค้นหาของคุณ เฉพาะข้อความค้นหาที่มีไวยากรณ์ที่ไม่ถูกต้องเท่านั้นที่จะสร้างข้อผิดพลาดนี้
ขั้นตอนการแก้ไขปัญหา
ตรวจสอบให้แน่ใจว่าคุณได้กำหนดค่าเซิร์ฟเวอร์การพัฒนาให้แสดงข้อผิดพลาดทั้งหมด คุณสามารถทำได้โดยการวางนี้ที่ด้านบนของไฟล์ของคุณหรือในไฟล์ config error_reporting(-1);ของคุณ: หากคุณมีข้อผิดพลาดทางไวยากรณ์สิ่งนี้จะชี้ให้คุณเห็น
ใช้mysql_error().
mysql_error()
จะรายงานข้อผิดพลาดที่ MySQL พบขณะดำเนินการค้นหาของคุณตัวอย่างการใช้งาน:
mysql_connect($host, $username, $password) or die("cannot connect"); mysql_select_db($db_name) or die("cannot select DB"); $sql = "SELECT * FROM table_name"; $result = mysql_query($sql); if (false === $result) { echo mysql_error(); }
เรียกใช้แบบสอบถามของคุณจากบรรทัดคำสั่ง MySQL หรือเครื่องมือเช่นphpMyAdmin หากคุณมีข้อผิดพลาดทางไวยากรณ์ในข้อความค้นหาของคุณสิ่งนี้จะบอกคุณว่ามันคืออะไร
ตรวจสอบให้แน่ใจว่าคำพูดของคุณถูกต้อง คำพูดรอบแบบสอบถามหรือค่าที่ขาดหายไปอาจทำให้แบบสอบถามล้มเหลวได้
ตรวจสอบให้แน่ใจว่าคุณกำลังหลีกหนีค่านิยมของคุณ เครื่องหมายคำพูดในแบบสอบถามของคุณอาจทำให้แบบสอบถามล้มเหลว (และปล่อยให้คุณเปิดการแทรก SQL) ใช้mysql_real_escape_string()เพื่อหลีกเลี่ยงข้อมูลที่คุณป้อน
ตรวจสอบว่าคุณไม่ได้ผสม
mysqli_*
และmysql_*
ฟังก์ชั่น ไม่ใช่สิ่งเดียวกันและไม่สามารถใช้ร่วมกันได้ (หากคุณจะเลือกอย่างใดอย่างหนึ่งด้วยmysqli_*
ดูเหตุผลด้านล่าง)
เคล็ดลับอื่น ๆ
mysql_*
ไม่ควรใช้ฟังก์ชันสำหรับรหัสใหม่ พวกเขาจะรักษาไม่และชุมชนได้เริ่มกระบวนการการเลิกใช้ คุณควรเรียนรู้เกี่ยวกับงบที่เตรียมไว้และใช้PDOหรือMySQLiแทน หากคุณไม่สามารถตัดสินใจได้บทความนี้จะช่วยในการเลือก หากคุณสนใจที่จะเรียนรู้และนี่คือการกวดวิชา PDO ดี
เกิดข้อผิดพลาดที่นี่เนื่องจากการใช้เครื่องหมายคำพูดเดี่ยว ( '
) คุณสามารถใส่ข้อความค้นหาของคุณดังนี้:
mysql_query("
SELECT * FROM Users
WHERE UserName
LIKE '".mysql_real_escape_string ($username)."'
");
ใช้mysql_real_escape_string
เพื่อป้องกันการฉีด SQL แม้ว่าเราควรใช้ส่วนขยาย MySQLi หรือ PDO_MYSQL สำหรับ PHP เวอร์ชันอัปเกรด (PHP 5.5.0 ขึ้นไป) แต่สำหรับเวอร์ชันเก่าmysql_real_escape_string
จะทำตามเคล็ดลับ
ตามที่scompt.comอธิบายไว้แบบสอบถามอาจล้มเหลว ใช้รหัสนี้เพื่อรับข้อผิดพลาดของแบบสอบถามหรือผลลัพธ์ที่ถูกต้อง:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query(" SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");
if($result) { while($row = mysql_fetch_array($result)) { echo $row['FirstName'];
}
} else {
echo 'Invalid query: ' . mysql_error() . "\n";
echo 'Whole query: ' . $query;
}
ดูเอกสารสำหรับmysql_query()ข้อมูลเพิ่มเติม
ข้อผิดพลาดที่แท้จริงคือเครื่องหมายคำพูดเดียวจึง$username
ไม่สามารถแยกวิเคราะห์ตัวแปรได้ แต่คุณควรใช้mysql_real_escape_string($username)
เพื่อหลีกเลี่ยงการแทรก SQL
$username
คำพูดใส่รอบ ค่าสตริงซึ่งตรงข้ามกับค่าตัวเลขต้องอยู่ในเครื่องหมายคำพูด
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
นอกจากนี้ไม่มีจุดใดในการใช้LIKE
เงื่อนไขหากคุณไม่ได้ใช้สัญลักษณ์แทน: หากคุณต้องการการจับคู่แบบตรงทั้งหมดให้ใช้=
แทนLIKE
.
โปรดตรวจสอบเมื่อฐานข้อมูลที่เลือกไม่ได้เป็นเพราะบางครั้งฐานข้อมูลไม่ได้ถูกเลือก
ตรวจสอบ
mysql_select_db('database name ')or DIE('Database name is not available!');
ก่อนการสืบค้น MySQL จากนั้นไปที่ขั้นตอนถัดไป
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
f($result === FALSE) {
die(mysql_error());
รหัสของคุณควรเป็นแบบนี้
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM Users WHERE UserName LIKE '$username'";
echo $query; $result = mysql_query($query); if($result === FALSE) {
die(mysql_error("error message for the user"));
}
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
เมื่อเสร็จแล้วคุณจะได้รับแบบสอบถามพิมพ์บนหน้าจอ ลองใช้แบบสอบถามนี้บนเซิร์ฟเวอร์ของคุณและดูว่าได้ผลลัพธ์ที่ต้องการหรือไม่ เวลาส่วนใหญ่เกิดข้อผิดพลาดในแบบสอบถาม รหัสส่วนที่เหลือถูกต้อง
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
คุณกำหนดสตริงโดยใช้เครื่องหมายคำพูดเดี่ยวและ PHP ไม่แยกวิเคราะห์สตริงที่คั่นด้วยเครื่องหมายคำพูดเดี่ยว ในการรับการแก้ไขตัวแปรคุณจะต้องใช้เครื่องหมายคำพูดคู่หรือการต่อสตริง (หรือการรวมกัน) ดูhttp://php.net/manual/en/language.types.string.php สำหรับข้อมูลเพิ่มเติม.
นอกจากนี้คุณควรตรวจสอบว่า mysql_query ส่งคืนทรัพยากรผลลัพธ์ที่ถูกต้องมิฉะนั้น fetch_ *, num_rows ฯลฯ จะไม่ทำงานกับผลลัพธ์เนื่องจากไม่ใช่ผลลัพธ์! IE:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
if( $result === FALSE ) { trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR); } else { while( $row = mysql_fetch_array($result) ) { echo $row['username'];
}
}
http://us.php.net/manual/en/function.mysql-query.php สำหรับข้อมูลเพิ่มเติม.
แบบสอบถามนี้ควรใช้งานได้:
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
ปัญหาคืออัญประกาศเดี่ยวดังนั้นการสืบค้นของคุณจึงล้มเหลวและส่งกลับ FALSE และ WHILE loop ของคุณไม่สามารถดำเนินการได้ การใช้% ช่วยให้คุณสามารถจับคู่ผลลัพธ์ที่มีสตริงของคุณได้ (เช่น SomeText- $ username-SomeText)
นี่เป็นเพียงคำตอบสำหรับคำถามของคุณคุณควรใช้สิ่งที่กล่าวถึงในโพสต์อื่น ๆ : การจัดการข้อผิดพลาดใช้สตริง Escape (ผู้ใช้สามารถพิมพ์อะไรก็ได้ในฟิลด์และคุณต้องตรวจสอบให้แน่ใจว่าไม่ใช่รหัสที่กำหนดเอง) ใช้PDOแทน mysql_connect ซึ่งตอนนี้เลิกใช้แล้ว
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
บางครั้งการระงับแบบสอบถามเป็น @mysql_query(your query);
หากคุณลองทุกอย่างที่นี่แล้ว แต่ไม่ได้ผลคุณอาจต้องการตรวจสอบการเปรียบเทียบฐานข้อมูล MySQL ของคุณ เหมืองถูกกำหนดให้เป็นแบบเรียงตามสวีเดน จากนั้นฉันก็เปลี่ยนเป็นutf8_general_ci
และทุกอย่างก็คลิกเข้าเกียร์
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4"; while( $data = mysql_fetch_array($query)) { echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");
}
แทนที่จะใช้คิวรี WHERE คุณสามารถใช้คิวรี ORDER BY นี้ได้ จะดีกว่านี้สำหรับการใช้แบบสอบถาม
ฉันทำแบบสอบถามนี้แล้วและไม่ได้รับข้อผิดพลาดเช่นพารามิเตอร์หรือบูลีน
ลองสิ่งนี้ต้องใช้งานได้มิฉะนั้นคุณต้องพิมพ์ข้อผิดพลาดเพื่อระบุปัญหาของคุณ
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * from Users WHERE UserName LIKE '$username'";
$result = mysql_query($sql,$con); while($row = mysql_fetch_array($result)) { echo $row['FirstName'];
}
อาจมีสองสาเหตุ:
คุณได้เปิดการเชื่อมต่อกับฐานข้อมูลก่อนที่จะเรียกใช้ฟังก์ชัน mysql_query หรือไม่? ฉันไม่เห็นสิ่งนั้นในรหัสของคุณ ใช้ mysql_connect ก่อนทำการสืบค้น ดู
php.net/manual/en/function.mysql-connect.php
ตัวแปร$ usernameถูกใช้ภายในสตริงคำพูดเดียวดังนั้นค่าของมันจะไม่ได้รับการประเมินภายในแบบสอบถาม แบบสอบถามจะล้มเหลวแน่นอน
ประการที่สามโครงสร้างของแบบสอบถามมีแนวโน้มที่จะฉีด SQL คุณอาจใช้ข้อความที่เตรียมไว้เพื่อหลีกเลี่ยงภัยคุกคามด้านความปลอดภัยนี้
ลองใช้รหัสต่อไปนี้ มันอาจจะทำงานได้ดี
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
ไปที่config.php
ไฟล์. ฉันมีปัญหาเดียวกัน. ตรวจสอบชื่อผู้ใช้และรหัสผ่านและ sql select เป็นชื่อเดียวกับ config
อย่าใช้ฟังก์ชัน mysql_ * ที่ไม่มีค่าใช้จ่าย (depricated ใน php 5.5 จะถูกลบออกใน php 7) และคุณสามารถทำได้ด้วยmysqliหรือpdo
นี่คือแบบสอบถามเลือกที่สมบูรณ์
<?php
$servername = "localhost"; $username = "username";
$password = "password"; $dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql); if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
// code here
}
} else {
echo "0 results";
}
$conn->close();
?>
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."'");
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
?>
และหากมีผู้ใช้ที่มีชื่อผู้ใช้เฉพาะคุณสามารถใช้ "=" ได้ ไม่จำเป็นต้องชอบ
คำถามของคุณจะเป็น:
mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");
รวมตัวแปรสตริงการเชื่อมต่อก่อนคิวรี MySQL ตัวอย่างเช่น$connt
ในรหัสนี้:
$results = mysql_query($connt, "SELECT * FROM users");
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
{
echo $row['FirstName'];
}
?>
ลองสิ่งนี้
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');
if($result){ while($row = mysqli_fetch_array($result)) { echo $row['FirstName'];
}
}
เมื่อใดก็ตามที่คุณได้รับ ...
"คำเตือน: mysqli_fetch_object () คาดว่าพารามิเตอร์ 1 จะเป็น mysqli_result โดยให้บูลีน"
... เป็นไปได้ว่ามีปัญหากับคำถามของคุณ prepare()
หรือquery()
อาจส่งคืนFALSE
(บูลีน) แต่ความล้มเหลวนี้ข้อความทั่วไปไม่ปล่อยให้คุณมากในทางของเบาะแส คุณจะทราบได้อย่างไรว่ามีอะไรผิดปกติกับคำถามของคุณ? คุณถาม !
ก่อนอื่นตรวจสอบให้แน่ใจว่าการรายงานข้อผิดพลาดเปิดอยู่และมองเห็นได้: เพิ่มสองบรรทัดนี้ที่ด้านบนของไฟล์ของคุณหลัง<?php
แท็กเปิดของคุณ:
error_reporting(E_ALL);
ini_set('display_errors', 1);
หากการรายงานข้อผิดพลาดของคุณถูกตั้งค่าไว้ใน php.ini คุณจะไม่ต้องกังวลเกี่ยวกับเรื่องนี้ เพียงตรวจสอบให้แน่ใจว่าคุณจัดการข้อผิดพลาดได้อย่างดีและอย่าเปิดเผยสาเหตุที่แท้จริงของปัญหาใด ๆ ให้กับผู้ใช้ของคุณทราบ การเปิดเผยสาเหตุที่แท้จริงต่อสาธารณะอาจเป็นคำเชิญที่สลักด้วยทองคำสำหรับผู้ที่ต้องการทำร้ายไซต์และเซิร์ฟเวอร์ของคุณ หากคุณไม่ต้องการส่งข้อผิดพลาดไปยังเบราว์เซอร์คุณสามารถตรวจสอบบันทึกข้อผิดพลาดของเว็บเซิร์ฟเวอร์ได้ตลอดเวลา สถานที่เข้าสู่ระบบจะแตกต่างจากเซิร์ฟเวอร์เช่นเซิร์ฟเวอร์บน Ubuntu /var/log/apache2/error.log
บันทึกข้อผิดพลาดมักจะตั้งอยู่ที่ หากคุณกำลังตรวจสอบบันทึกข้อผิดพลาดในสภาพแวดล้อม Linux คุณสามารถใช้tail -f /path/to/log
ในหน้าต่างคอนโซลเพื่อดูข้อผิดพลาดที่เกิดขึ้นแบบเรียลไทม์ .... หรือตามที่คุณสร้างขึ้น
เมื่อคุณกำลังยกกำลังสองในการรายงานข้อผิดพลาดมาตรฐานเพิ่มการตรวจสอบข้อผิดพลาดในการเชื่อมต่อฐานข้อมูลของคุณและแบบสอบถามจะให้รายละเอียดเพิ่มเติมเกี่ยวกับปัญหาที่เกิดขึ้น ดูตัวอย่างนี้ซึ่งชื่อคอลัมน์ไม่ถูกต้อง ขั้นแรกรหัสที่ส่งคืนข้อความแสดงข้อผิดพลาดร้ายแรงทั่วไป:
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; $query = $mysqli->prepare($sql)); // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute();
ข้อผิดพลาดเป็นเรื่องทั่วไปและไม่เป็นประโยชน์กับคุณมากนักในการแก้ไขสิ่งที่เกิดขึ้น
กับคู่ของบรรทัดที่มากขึ้นของรหัสที่คุณจะได้รับข้อมูลรายละเอียดมากที่คุณสามารถใช้เพื่อแก้ปัญหาทันที ตรวจสอบprepare()
ข้อความว่าเป็นความจริงหรือไม่และหากเป็นสิ่งที่ดีคุณสามารถดำเนินการต่อเพื่อผูกมัดและดำเนินการได้
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute();
// any additional code you need would go here.
} else {
$error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
// handle error
}
หากมีสิ่งผิดปกติคุณสามารถพ่นข้อความแสดงข้อผิดพลาดซึ่งจะนำคุณไปสู่ปัญหาโดยตรง ในกรณีนี้ไม่มีfoo
คอลัมน์ในตารางการแก้ปัญหาเป็นเรื่องเล็กน้อย
หากคุณเลือกคุณสามารถรวมการตรวจสอบนี้ในฟังก์ชันหรือคลาสและขยายได้โดยจัดการข้อผิดพลาดอย่างสง่างามตามที่กล่าวไว้ก่อนหน้านี้
ขั้นแรกตรวจสอบการเชื่อมต่อกับฐานข้อมูล เชื่อมต่อสำเร็จหรือไม่?
ถ้าเสร็จแล้วหลังจากนั้นฉันก็เขียนโค้ดนี้และมันก็ใช้ได้ดี:
if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) { $Q1mrks = $_GET['q1mrks']; $marks = $_GET['marks']; $qt1 = $_GET['qt1']; $qtype_qry = mysql_query("
SELECT *
FROM s_questiontypes
WHERE quetype_id = '$qt1' "); $row = mysql_fetch_assoc($qtype_qry); $qcode = $row['quetype_code']; $sq_qry = "
SELECT *
FROM s_question
WHERE quetype_code = '$qcode' ORDER BY RAND() LIMIT $Q1mrks
";
$sq_qry = mysql_query(" SELECT * FROM s_question WHERE quetype_code = '$qcode'
LIMIT $Q1mrks "); while ($qrow = mysql_fetch_array($sq_qry)) { $qm = $qrow['marks'] . "<br />"; $total += $qm . "<br />"; } echo $total . "/" . $marks;
}
ตรวจสอบให้แน่ใจว่าคุณไม่ได้ปิดฐานข้อมูลโดยใช้ db_close () ก่อนที่จะเรียกใช้แบบสอบถามของคุณ:
หากคุณใช้แบบสอบถามหลายรายการในสคริปต์แม้ว่าคุณจะรวมเพจอื่น ๆ ที่มีคิวรีหรือการเชื่อมต่อฐานข้อมูลด้วยก็อาจเป็นไปได้ว่าคุณใช้ db_close () ที่ใดก็ได้ที่จะปิดการเชื่อมต่อฐานข้อมูลของคุณดังนั้นตรวจสอบให้แน่ใจว่าคุณ อย่าทำผิดพลาดนี้ในสคริปต์ของคุณ
หากคุณไม่มี MySQL Error ปรากฏขึ้นขณะตรวจสอบให้แน่ใจว่าคุณได้สร้างตารางฐานข้อมูลของคุณอย่างถูกต้อง เรื่องนี้เกิดขึ้นกับฉัน มองหาเครื่องหมายจุลภาคหรือเครื่องหมายคำพูดที่ไม่ต้องการ
ตรวจสอบการเชื่อมต่อของคุณก่อน
จากนั้นหากคุณต้องการดึงค่าที่แน่นอนจากฐานข้อมูลคุณควรเขียน:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");
หรือคุณต้องการดึงLIKE
ประเภทของค่าคุณควรเขียน:
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
นอกจากนี้คุณยังสามารถตรวจสอบว่า wether $result
ล้มเหลวเช่นนี้ก่อนที่จะเรียกใช้อาร์เรย์การดึงข้อมูล
$username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); if(!$result)
{
echo "error executing query: "+mysql_error();
}else{
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
}
โดยปกติข้อผิดพลาดจะเกิดขึ้นเมื่อการเชื่อมต่อฐานข้อมูลของคุณล้มเหลวดังนั้นอย่าลืมเชื่อมต่อฐานข้อมูลของคุณหรือรวมไฟล์ฐานข้อมูลไว้ด้วย
include_once(db_connetc.php');
หรือ
// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error()); //Select database mysql_select_db("db_name", $connection) or die(mysql_error());
$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";
$employee_data = mysql_query($employee_query);
if (mysql_num_rows($employee_data) > 0) { while ($row = mysql_fetch_array($employee_data)){ echo $row['emp_name'];
} // end of while loop
} // end of if
- แนวทางปฏิบัติที่ดีที่สุดคือเรียกใช้แบบสอบถามใน sqlyog จากนั้นคัดลอกลงในโค้ดเพจของคุณ
- เก็บคำค้นหาของคุณไว้ในตัวแปรเสมอจากนั้นจึงสะท้อนตัวแปรนั้น
mysql_query($query_variable);
จากนั้นผ่านไป
ตามเนื้อผ้า PHP อดทนต่อการปฏิบัติที่ไม่ดีและความล้มเหลวของโค้ดซึ่งทำให้การดีบักค่อนข้างยาก ปัญหาในกรณีนี้โดยเฉพาะคือว่าทั้งmysqliและPDOFALSE
โดยค่าเริ่มต้นไม่ได้บอกคุณเมื่อแบบสอบถามล้มเหลวและเพียงแค่ผลตอบแทน (ฉันจะไม่พูดถึงส่วนขยายmysql ที่ถูกตัดทอนการสนับสนุนสำหรับคำสั่งที่เตรียมไว้เป็นเหตุผลที่ยากที่จะเปลี่ยนเป็นPDOหรือmysqli ) แต่คุณสามารถเปลี่ยนพฤติกรรมเริ่มต้นของ PHP เพื่อให้มีข้อยกเว้นเสมอเมื่อการสืบค้นล้มเหลว
สำหรับPDO : ใช้$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
error_reporting(E_ALL);
$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $result = $pdo->query('select emal from users'); $data = $result->fetchAll();
สิ่งนี้จะแสดงสิ่งต่อไปนี้ให้คุณ:
ข้อผิดพลาดร้ายแรง: ข้อยกเว้นที่ไม่ถูกจับ 'PDOException' พร้อมข้อความ 'SQLSTATE [42S22]: ไม่พบคอลัมน์: 1054 คอลัมน์ที่ไม่รู้จัก' emal 'ใน' รายการฟิลด์ 'ใน E: \ htdocs \ test \ mysql_errors \ pdo.php ในบรรทัดที่ 8
PDOException: SQLSTATE [42S22]: ไม่พบคอลัมน์: 1054 คอลัมน์ที่ไม่รู้จัก 'emal' ใน 'รายการฟิลด์' ใน E: \ htdocs \ test \ mysql_errors \ pdo.php ในบรรทัดที่ 8
อย่างที่คุณเห็นจะบอกคุณได้อย่างชัดเจนว่าข้อความค้นหามีอะไรผิดพลาดและจะแก้ไขได้ที่ไหนในโค้ดของคุณ
หากไม่มี$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
คุณจะได้รับ
ข้อผิดพลาดร้ายแรง: เรียกใช้ฟังก์ชันสมาชิก fetchAll () บนบูลีนใน E: \ htdocs \ test \ mysql_errors \ pdo.php ในบรรทัดที่ 9
สำหรับmysqli : ใช้mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test'); $result = $mysqli->query('select emal from users'); $data = $result->fetch_all();
คุณจะได้รับ
ข้อผิดพลาดร้ายแรง: ข้อยกเว้นที่ไม่ถูกจับ 'mysqli_sql_exception' พร้อมข้อความ 'คอลัมน์ที่ไม่รู้จัก' emal 'ใน' รายการฟิลด์ '' ใน E: \ htdocs \ test \ mysql_errors \ mysqli.php ในบรรทัดที่ 8
mysqli_sql_exception: คอลัมน์ที่ไม่รู้จัก 'emal' ใน 'รายการฟิลด์' ใน E: \ htdocs \ test \ mysql_errors \ mysqli.php ในบรรทัดที่ 8
โดยที่mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
คุณไม่ได้รับเท่านั้น
ข้อผิดพลาดร้ายแรง: เรียกใช้ฟังก์ชันสมาชิก fetch_all () บนบูลีนใน E: \ htdocs \ test \ mysql_errors \ mysqli.php ที่บรรทัด 10
แน่นอนคุณสามารถตรวจสอบข้อผิดพลาด MySQL ได้ด้วยตนเอง แต่ฉันจะแทบบ้าถ้าต้องทำแบบนั้นทุกครั้งที่พิมพ์ผิดหรือแย่กว่านั้นทุกครั้งที่ฉันต้องการสืบค้นฐานข้อมูล
ลองใช้รหัสนี้ใช้งานได้ดี
กำหนดตัวแปรโพสต์ให้กับตัวแปร
$username = $_POST['uname'];
$password = $_POST['pass'];
$result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username');
if(!empty($result)){ while($row = mysql_fetch_array($result)){ echo $row['FirstName'];
}
}