mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows ฯลฯ ... คาดว่าพารามิเตอร์ 1 จะเป็นทรัพยากร

Jun 04 2010

ฉันพยายามเลือกข้อมูลจากตาราง 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'];
}

คำตอบ

670 EdwardDale Jun 04 2010 at 17:19

แบบสอบถามอาจล้มเหลวด้วยเหตุผลหลายประการซึ่งในกรณีนี้ทั้ง 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 ที่ไม่ถูกต้อง นอกจากนี้ยังมีข้อความผิดพลาดฐานข้อมูลไม่ควรที่จะแสดงให้ผู้ใช้ไม่ใช่ผู้ดูแลระบบเป็นมันเปิดเผยข้อมูลมากเกินไป

166 JohnConde Jul 27 2012 at 00:00

ข้อความแสดงข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อคุณมีข้อผิดพลาดในแบบสอบถามของคุณซึ่งทำให้ล้มเหลว มันจะปรากฏขึ้นเมื่อใช้:

  • 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 ดี

112 nik Jun 04 2010 at 17:24

เกิดข้อผิดพลาดที่นี่เนื่องจากการใช้เครื่องหมายคำพูดเดี่ยว ( ') คุณสามารถใส่ข้อความค้นหาของคุณดังนี้:

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จะทำตามเคล็ดลับ

60 2ndkauboy Jun 04 2010 at 17:31

ตามที่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

52 MatteoRiva Jun 04 2010 at 17:22

$usernameคำพูดใส่รอบ ค่าสตริงซึ่งตรงข้ามกับค่าตัวเลขต้องอยู่ในเครื่องหมายคำพูด

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

นอกจากนี้ไม่มีจุดใดในการใช้LIKEเงื่อนไขหากคุณไม่ได้ใช้สัญลักษณ์แทน: หากคุณต้องการการจับคู่แบบตรงทั้งหมดให้ใช้=แทนLIKE.

42 yasin Apr 25 2012 at 12:14

โปรดตรวจสอบเมื่อฐานข้อมูลที่เลือกไม่ได้เป็นเพราะบางครั้งฐานข้อมูลไม่ได้ถูกเลือก

ตรวจสอบ

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());
40 Chaitannya Jun 04 2010 at 18:28

รหัสของคุณควรเป็นแบบนี้

$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'];
}

เมื่อเสร็จแล้วคุณจะได้รับแบบสอบถามพิมพ์บนหน้าจอ ลองใช้แบบสอบถามนี้บนเซิร์ฟเวอร์ของคุณและดูว่าได้ผลลัพธ์ที่ต้องการหรือไม่ เวลาส่วนใหญ่เกิดข้อผิดพลาดในแบบสอบถาม รหัสส่วนที่เหลือถูกต้อง

34 derokorian Jan 08 2012 at 10:48
$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 สำหรับข้อมูลเพิ่มเติม.

33 EnisP.Aginić Apr 23 2013 at 16:34

แบบสอบถามนี้ควรใช้งานได้:

$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 ซึ่งตอนนี้เลิกใช้แล้ว

27 DipPokhrel May 10 2013 at 20:46
$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);

27 kolexinfos Sep 06 2012 at 22:32

หากคุณลองทุกอย่างที่นี่แล้ว แต่ไม่ได้ผลคุณอาจต้องการตรวจสอบการเปรียบเทียบฐานข้อมูล MySQL ของคุณ เหมืองถูกกำหนดให้เป็นแบบเรียงตามสวีเดน จากนั้นฉันก็เปลี่ยนเป็นutf8_general_ciและทุกอย่างก็คลิกเข้าเกียร์

25 Gears.of.Codes Jul 21 2013 at 23:20
$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 นี้ได้ จะดีกว่านี้สำหรับการใช้แบบสอบถาม

ฉันทำแบบสอบถามนี้แล้วและไม่ได้รับข้อผิดพลาดเช่นพารามิเตอร์หรือบูลีน

25 AmjadOmari Feb 25 2013 at 20:33

ลองสิ่งนี้ต้องใช้งานได้มิฉะนั้นคุณต้องพิมพ์ข้อผิดพลาดเพื่อระบุปัญหาของคุณ

$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'];
}
21 asim-ishaq May 05 2013 at 01:57

อาจมีสองสาเหตุ:

  1. คุณได้เปิดการเชื่อมต่อกับฐานข้อมูลก่อนที่จะเรียกใช้ฟังก์ชัน mysql_query หรือไม่? ฉันไม่เห็นสิ่งนั้นในรหัสของคุณ ใช้ mysql_connect ก่อนทำการสืบค้น ดูphp.net/manual/en/function.mysql-connect.php

  2. ตัวแปร$ usernameถูกใช้ภายในสตริงคำพูดเดียวดังนั้นค่าของมันจะไม่ได้รับการประเมินภายในแบบสอบถาม แบบสอบถามจะล้มเหลวแน่นอน

ประการที่สามโครงสร้างของแบบสอบถามมีแนวโน้มที่จะฉีด SQL คุณอาจใช้ข้อความที่เตรียมไว้เพื่อหลีกเลี่ยงภัยคุกคามด้านความปลอดภัยนี้

19 ravi May 30 2013 at 14:40

ลองใช้รหัสต่อไปนี้ มันอาจจะทำงานได้ดี

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}
15 user2835116 Oct 01 2013 at 20:48

ไปที่config.phpไฟล์. ฉันมีปัญหาเดียวกัน. ตรวจสอบชื่อผู้ใช้และรหัสผ่านและ sql select เป็นชื่อเดียวกับ config

15 MKD Apr 16 2015 at 13:53

อย่าใช้ฟังก์ชัน 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();
?>
14 JanakPrajapati Sep 19 2013 at 15:39
<?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."'");
14 Durairaj Oct 30 2013 at 12:11

รวมตัวแปรสตริงการเชื่อมต่อก่อนคิวรี MySQL ตัวอย่างเช่น$conntในรหัสนี้:

$results = mysql_query($connt, "SELECT * FROM users");
11 DennisKiptugen Apr 07 2015 at 01:01
<?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'];
 }
 ?>
11 SuReSh Apr 28 2015 at 13:05

ลองสิ่งนี้

$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'];
}
}
11 JayBlanchard Aug 06 2015 at 03:53

เมื่อใดก็ตามที่คุณได้รับ ...

"คำเตือน: 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คอลัมน์ในตารางการแก้ปัญหาเป็นเรื่องเล็กน้อย

หากคุณเลือกคุณสามารถรวมการตรวจสอบนี้ในฟังก์ชันหรือคลาสและขยายได้โดยจัดการข้อผิดพลาดอย่างสง่างามตามที่กล่าวไว้ก่อนหน้านี้

9 Noname Apr 29 2013 at 17:24

ขั้นแรกตรวจสอบการเชื่อมต่อกับฐานข้อมูล เชื่อมต่อสำเร็จหรือไม่?

ถ้าเสร็จแล้วหลังจากนั้นฉันก็เขียนโค้ดนี้และมันก็ใช้ได้ดี:

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;
}
9 A.Aleem11 Oct 13 2014 at 22:07

ตรวจสอบให้แน่ใจว่าคุณไม่ได้ปิดฐานข้อมูลโดยใช้ db_close () ก่อนที่จะเรียกใช้แบบสอบถามของคุณ:

หากคุณใช้แบบสอบถามหลายรายการในสคริปต์แม้ว่าคุณจะรวมเพจอื่น ๆ ที่มีคิวรีหรือการเชื่อมต่อฐานข้อมูลด้วยก็อาจเป็นไปได้ว่าคุณใช้ db_close () ที่ใดก็ได้ที่จะปิดการเชื่อมต่อฐานข้อมูลของคุณดังนั้นตรวจสอบให้แน่ใจว่าคุณ อย่าทำผิดพลาดนี้ในสคริปต์ของคุณ

7 user1012181 Nov 08 2014 at 20:36

หากคุณไม่มี MySQL Error ปรากฏขึ้นขณะตรวจสอบให้แน่ใจว่าคุณได้สร้างตารางฐานข้อมูลของคุณอย่างถูกต้อง เรื่องนี้เกิดขึ้นกับฉัน มองหาเครื่องหมายจุลภาคหรือเครื่องหมายคำพูดที่ไม่ต้องการ

6 Omdev Jul 06 2013 at 20:02

ตรวจสอบการเชื่อมต่อของคุณก่อน

จากนั้นหากคุณต้องการดึงค่าที่แน่นอนจากฐานข้อมูลคุณควรเขียน:

$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%'");
5 user28864 Dec 16 2013 at 03:27

นอกจากนี้คุณยังสามารถตรวจสอบว่า 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'];
       }
}
3 EngrZardari Jan 21 2014 at 11:21

โดยปกติข้อผิดพลาดจะเกิดขึ้นเมื่อการเชื่อมต่อฐานข้อมูลของคุณล้มเหลวดังนั้นอย่าลืมเชื่อมต่อฐานข้อมูลของคุณหรือรวมไฟล์ฐานข้อมูลไว้ด้วย

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);จากนั้นผ่านไป
2 PaulSpiegel Apr 07 2019 at 05:18

ตามเนื้อผ้า 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 ได้ด้วยตนเอง แต่ฉันจะแทบบ้าถ้าต้องทำแบบนั้นทุกครั้งที่พิมพ์ผิดหรือแย่กว่านั้นทุกครั้งที่ฉันต้องการสืบค้นฐานข้อมูล

1 Riteshdjoshi Apr 28 2014 at 15:52

ลองใช้รหัสนี้ใช้งานได้ดี

กำหนดตัวแปรโพสต์ให้กับตัวแปร

   $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'];
     }
}