จะแก้“ ข้อผิดพลาดร้ายแรง: ไม่พบคลาส 'MySQLi' ได้อย่างไร?


95

ฉันกำลังทำแบบฝึกหัดและได้รับข้อผิดพลาดนี้:

ข้อผิดพลาดร้ายแรง: ไม่พบคลาส 'MySQLi' (LONG URL) ในบรรทัดที่ 8

รหัสในบรรทัดที่ 8 คือ:

$mysqli = new MySQLi($db_server, $db_user, $db_pass, $db_name);

ฉันเห็นคนออนไลน์บอกว่าเปิดอยู่ใน phpinfo () ของฉันหรือไม่ แต่ไม่มีรายการอะไรใน "mysqli" ในนั้น

นอกจากนี้ฉันใช้ PHP เวอร์ชัน 5.2.5


คุณสามารถใช้คลาส MYSQLi ที่เขียนด้วยลายมือได้ดังนั้นคุณไม่จำเป็นต้องติดตั้ง mysqli เป็นทางออกเดียวหากคุณไม่ได้เป็นเจ้าของเซิร์ฟเวอร์
ไก่


คำตอบ:


86

เสียงเหมือนคุณเพียงแค่ต้องติดตั้ง MySQLi

หากคุณคิดว่าทำไปแล้วและยังมีปัญหาอยู่โปรดโพสต์ระบบปฏิบัติการของคุณและสิ่งอื่น ๆ ที่อาจช่วยในการวินิจฉัยเพิ่มเติม


21
บน AWS คุณเพิ่งเรียกใช้sudo yum install php-mysqli
bobobobo

สำหรับฉันมันได้รับการแก้ไขด้วย: apt-get install php7.0-mysql ฉันกำลังใช้งาน Raspbian Stretch 9
negrotico19

บน AWS กับ amazon linux มันจะเป็นแบบนี้sudo yum install php56-mysqlnd.x86_64(เลือกอันที่ตรงกับเวอร์ชั่นของ php ที่คุณติดตั้งไว้)
ฤกษ์ดี 99

47

คุณสามารถตรวจสอบว่ามีไลบรารี mysqli อยู่หรือไม่โดยเรียกใช้รหัสนี้:

if (!function_exists('mysqli_init') && !extension_loaded('mysqli')) {
    echo 'We don\'t have mysqli!!!';
} else {
    echo 'Phew we have it!';
}

6
ฉันยังคงได้รับ "เราไม่มี mysqli !!!" แม้หลังจากเรียกใช้ `sudo apt-get install php5-mysqlnd`?
Banned_User

ฉันได้รับ 'Phew เรามี แต่ฉันยังคงได้รับข้อผิดพลาดเดียวกันกับที่ Class' msqli 'ไม่พบใน ... มีความคิดใดบ้าง
PA-GW

38

หากคุณใช้Ubuntuให้รัน:

 sudo apt-get install php-mysqlnd

5
และอย่าลืมรีสตาร์ท Apache หลังจากนี้!
fracz

@fracz การรีสตาร์ท Apache เป็นส่วนที่ฉันลืมไป ฉันรีสตาร์ท MySQL เท่านั้น ขอบคุณ.
เจมส์

แค่นี้ยังไม่พอ ฉันยังขาดแพ็คเกจ php5-mysql ใช้sudo apt-get -y install php5-mysql php5-mysqlndเพื่อรับทั้งสองอย่าง มันคือสิ่งที่คุณขาดหายไป @Hermann Ingjaldsson?
Balmipour

มันเป็นข้อผิดพลาดในการกำหนดค่าบางอย่าง stackoverflow.com/questions/31535173/…
Fzs2

22

หากคุณกำลังเรียก "mysqli ใหม่ ( .. )" จากภายในชั้นที่ namespaced Fatal error: Class 'foo\bar\mysqli' not found inคุณอาจจะเห็นข้อผิดพลาดที่คล้ายกัน วิธีแก้ไขปัญหานี้คือตั้งค่าอย่างชัดเจนเป็นเนมสเปซรูทด้วยแบ็กสแลชที่อยู่ข้างหน้าดังนี้:

<?php 
$mysqli = new \MySQLi($db_server, $db_user, $db_pass, $db_name);

1
สิ่งนี้ควรเป็นสิ่งแรกที่ต้องดู
James Bailey

15

นอกเหนือจากการยกเลิกการใส่ข้อคิดเห็นส่วนขยายphp_mysqli.dllในphp.iniแล้วยังยกเลิกการใส่เครื่องหมายคำสั่งextension_dirในphp.iniและระบุตำแหน่งของคุณ:

extension_dir = "C:\software\php\dist\ext"

สิ่งนี้ทำให้ฉันได้ผล


มันได้ผลสำหรับฉัน แต่./extซึ่งเป็นเส้นทางสัมพัทธ์ และผมก็มีการเปลี่ยนชื่อphp.ini-developmentไปphp.iniและ uncomment extension=php_mysqli.dllในแฟ้มที่ โอ้ที่รักฉันไม่คิดถึงคุณ PHP
Overdrivr

เคล็ดลับสำหรับฉันที่นี่ (บน Windows) คือพิมพ์พา ธ สัมบูรณ์ไปยังส่วนขยาย dir ใน "extension_dir"
TechNyquist




2

วิธีเปิดใช้งาน mysqli ใน php.ini

  1. แก้ไข / ยกเลิกการแสดงความคิดเห็นโดยการลบ ';' (โคลอน) การกำหนดค่าต่อไปนี้ใน php.ini: 1st (uncomment และ add config):
    include_path = "C:\php\includes"
    
    ที่ 2 (ไม่แสดงความคิดเห็น):
    extension_dir = "ext"
    
    3rd (ไม่แสดงความคิดเห็นและแก้ไขการกำหนดค่า):
    extension=C:/PHP/ext/php_mysql.dll
    extension=C:/PHP/ext/php_mysqli.dll
    
  2. รีสตาร์ทเซิร์ฟเวอร์ IIS
  3. ตรวจสอบให้แน่ใจว่า mysql กำลังทำงานบนระบบ

วิธีโหลดไฟล์ php.ini

  1. เปลี่ยนชื่อไฟล์ php.ini-production / php.ini-development เป็น php.ini จาก C: \ PHP (โปรดทราบว่าส่วนขยายจะเป็น ini คือ "php.ini")
  2. หลังจากเปลี่ยนชื่อเป็นไฟล์ php.ini รีสตาร์ทเซิร์ฟเวอร์
  3. ดูการเปลี่ยนแปลงใน http: //localhost/phpinfo.php

1

ฉันคิดว่าฉันอาจช่วยใครก็ได้ที่มีปัญหาเดียวกันโดยใช้เซิร์ฟเวอร์ Namesco ฉันพยายามแก้ไขปัญหานี้หลังจากย้ายฐานข้อมูลจากเซิร์ฟเวอร์ภายในเครื่องบนโฮมพีซีไปยังเนมโก พวกเขาจะไม่ช่วยพวกเขาบอกว่ามันเป็นปัญหาในการเข้ารหัส

  • อย่างไรก็ตามการแก้ไขจากอินเตอร์เฟสโฮสติ้ง CPANEl LINUX ทำได้ง่าย
  • คลิกที่ php
  • จากนั้นคลิกที่โมดูล php และจากรายการโมดูลที่ติดตั้งไว้ล่วงหน้าเพียงคลิกกล่องสำหรับ mysqli
  • จากนั้นคลิกบันทึก (ไม่จำเป็นต้องเปลี่ยนรหัสหากใช้งานได้บนเซิร์ฟเวอร์อื่น)

น่าเสียดายที่บทความสนับสนุนของพวกเขาเสียเวลา หลังจากอ่านสิ่งนี้ฉันไปที่ส่วนติดต่อผู้ดูแลระบบด้วยการตัดสินใจใหม่


0

การแจกแจงบางอย่าง (เช่นGentoo ) รองรับการติดตั้ง PHP หลายตัวและคุณต้องตรวจสอบให้แน่ใจว่าคุณกำลังใช้งานโดยติดตั้งและเปิดใช้งาน mysqli

ใน Gentoo ฉันได้ติดตั้ง PHP ใหม่แล้ว (โดยเปิดใช้งานแฟล็ก mysqli USE) แต่ฉันจำเป็นต้องเปิดใช้งาน PHP เวอร์ชันใหม่ (เนื่องจากอันเก่าต้องไม่มี mysqli):

# eselect php list apache2
  [1]   php5.3 *
  [2]   php5.5
# eselect php set apache2 2
You have to run `/etc/init.d/apache2 restart' for the changes to take effect
# /etc/init.d/apache2 restart

0

ฉันตรวจสอบทั้งหมดข้างต้นแล้วและมันไม่ได้ผลสำหรับฉัน

มีบางขั้นตอนที่ฉันพบ

ฉันใช้PHP เวอร์ชัน 5.5.9-1ubuntu4.17บนUbuntu 14.04

ขั้นแรกให้ตรวจสอบโฟลเดอร์

#ls /etc/php5/mods-available/
json.ini  mcrypt.ini  mysqli.ini  mysql.ini  mysqlnd.ini  opcache.ini  pdo.ini  pdo_mysql.ini  readline.ini  xcache.ini

หากไม่มีmysqli.iniโปรดอ่านคำตอบอื่น ๆ สำหรับการติดตั้ง

เปิดphp.iniค้นหาextension_dir

ในกรณีของฉันฉันต้องตั้งค่า extension_dir = /usr/lib/php5/20121212

และรีสตาร์ท apache2: /ect/init.d/apache2 restart


0

PHP zip ประกอบด้วยส่วนขยายที่ใช้บ่อยที่สุด (* .dll บน windows เช่น php_mysqli.dll) ภายใต้ไดเร็กทอรี \ ext อย่างไรก็ตามจะไม่ได้เปิดใช้งานตามค่าเริ่มต้น คุณอาจได้รับข้อผิดพลาดร้ายแรงนี้เมื่อพยายามใช้ MySQLi:

( ! ) Fatal error: Uncaught Error: Class 'mysqli' not found in C:\myProject\ class.Database.php on line 24

ในการเปิดใช้งานส่วนขยายให้เปิด php.ini (คุณอาจต้องคัดลอก php.ini-development ก่อนเป็น php.ini) และยกเลิกการแสดงความคิดเห็น (หรือเพิ่ม) สองบรรทัดนี้:

extension_dir = "ext"

และส่วนขยายเฉพาะใด ๆ ที่คุณได้รับข้อผิดพลาดร้ายแรงเช่น mysqli:

extension=mysqli




0

สำหรับใครก็ตามที่ใช้นักเทียบท่าฉันพบปัญหานี้และแก้ไขได้โดยใช้ Dockerfile ของฉันเองแทนภาพ php: fpm:

FROM php:fpm

RUN docker-php-ext-install mysqli

0

ฉันพบวิธีแก้ไขสำหรับปัญหานี้หลังจากขั้นตอนการวิเคราะห์ที่ยาวนาน หลังจากทดสอบการติดตั้ง php ของฉันด้วยคุณสมบัติบรรทัดคำสั่งอย่างถูกต้องฉันพบว่า php ทำงานได้ดีและสามารถทำงานกับฐานข้อมูล mysql ได้ Btw. คุณสามารถรันโค้ดไฟล์ด้วยโค้ด php ด้วยคำสั่ง php -f filename.php
ดังนั้นฉันจึงรู้ว่ามันต้องมีบางอย่างผิดปกติกับ Apache
ฉันสร้างไฟล์ที่มีฟังก์ชัน phpinfo () อยู่ข้างใน
ที่นี่ฉันเห็นว่าในบรรทัด
Loaded Configuration File
ไม่ได้โหลดไฟล์ config ของฉัน แต่มีการกล่าวถึงแทน (ไม่มี)

ในที่สุดฉันก็พบภายในการกำหนดค่า Apache รายการ

<IfModule php5_module>
    PHPINIDir "C:/xampp/php"
</IfModule>

แต่ฉันได้ติดตั้ง PHP 7 แล้วดังนั้น Apache จึงไม่สามารถโหลดไฟล์ php.ini ได้เนื่องจากไม่มีรายการสำหรับสิ่งนั้น ฉันเพิ่ม

<IfModule php7_module>
    PHPINIDir "C:/xampp/php"
</IfModule>

และหลังจากรีสตาร์ท Apache ทั้งหมดทำงานได้ดี

บล็อกโค้ดเหล่านี้ด้านบนที่ฉันพบในไฟล์ httpd-xampp.conf ของฉัน อาจเป็นที่อื่นในการกำหนดค่าของคุณ
ในไฟล์เดียวกันฉันได้เปลี่ยนก่อนการตั้งค่าสำหรับ php 7 แทนเวอร์ชัน php 5

#
# PHP-Module setup
#
#LoadFile "C:/xampp/php/php5ts.dll"
#LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"
LoadFile "C:/xampp/php/php7ts.dll"
LoadModule php7_module "C:/xampp/php/php7apache2_4.dll"

อย่างที่คุณเห็นฉันติดตั้งแพ็คเกจ xampp แล้ว แต่ปัญหานี้เกิดขึ้นที่ฝั่ง Apache



0

ฉันใช้ xampp และปัญหาของฉันได้รับการแก้ไขเมื่อฉันเปลี่ยนชื่อ:

extension_dir = "ext"

ถึง

extension_dir = "C:\xampp\php\ext"

PS: อย่าลืมรีสตาร์ท apache หลังจากทำการเปลี่ยนแปลงนี้!



0
  1. เปิดโฟลเดอร์ PHP ของคุณ
  2. ค้นหา php.ini-development แล้วเปิดขึ้นมา
  3. หา ;extension=mysqli
  4. ลบ;สัญลักษณ์
  5. บันทึกไฟล์และเปลี่ยนนามสกุลไฟล์จาก php.ini-development เป็น php.ini
  6. รีสตาร์ทเซิร์ฟเวอร์และทดสอบรหัส:
    if (!function_exists('mysqli_init') && !extension_loaded('mysqli')) {  
            echo 'We don\'t have mysqli!!!';  
     } else {  
         echo 'mysqli is installed';
     }
  1. หากไม่ได้ผลให้เปลี่ยนทั้ง extension_dir ใน php.ini จาก "ext" เป็น "c: \ php \ ext" และ extension = mysqli เป็น extension = php_mysqli.dll จากนั้นทดสอบอีกครั้ง อย่าลืมรีเซ็ตเซิร์ฟเวอร์ทุกครั้งที่ทดสอบ

-2
<?php  /* If the error is due to calling mysqli in a class */

    class dbconnect extends mysqli{

        private $host = 'localhost';
        private $user = 'root';
        private $pass = '';
        private $db = 'test';

        public function __construct() {
            parent::__construct($this->host, $this->user, $this->pass, $this->db);

            if (mysqli_connect_error()) {
                die('Connect Error (' . mysqli_connect_errno() . ') ' .
                    mysqli_connect_error());
            }
        }
    }
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.