คำเตือน: mysql_connect (): [2002] ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว (พยายามเชื่อมต่อผ่าน unix: ///tmp/mysql.sock) ใน


246

ฉันกำลังพยายามเชื่อมต่อกับฐานข้อมูล MySQL ของฉันด้วย Terminal บน Apple ของฉัน (ด้วย PHP)

เมื่อวานมันใช้ได้ดีและตอนนี้ฉันก็พบข้อผิดพลาดในชื่อ

สคริปต์ทำงานเมื่อฉันใช้เบราว์เซอร์เพื่อเรียกใช้ (ฉันติดตั้ง XAMPP) แต่เทอร์มินัลปฏิเสธที่จะเชื่อมต่อกับฐานข้อมูล

นี่คือไฟล์ที่ฉันรวมไว้เพื่อเชื่อมต่อ (สคริปต์ทำงานเมื่อฉันไม่ได้รวมสิ่งนี้ แต่จากนั้นมันจะไม่เชื่อมต่อกับฐานข้อมูล):

<?php
    mysql_connect("localhost", "root", "") or die(mysql_error());
    mysql_select_db("FNB1C_data") or die(mysql_error());
?>

มันน่าจะใช้ได้เพราะมันใช้ได้กับเบราว์เซอร์ของฉัน

php scriptname.phpการใช้คำสั่งฉันที่เทอร์มิ

คำตอบ:


415

ด้วยเหตุผลบางอย่าง mysql บน OS X ทำให้ตำแหน่งของไฟล์ซ็อกเก็ตที่ต้องการนั้นผิดเล็กน้อย แต่โชคดีที่วิธีแก้ปัญหานั้นง่ายพอ ๆ กับการตั้งค่าลิงก์สัญลักษณ์

คุณอาจมีซ็อกเก็ต (ปรากฏเป็นไฟล์ที่มีความยาวเป็นศูนย์) ในฐานะ/tmp/mysql.sockหรือ/var/mysql/mysql.sockแต่แอพอย่างน้อยหนึ่งแอพกำลังค้นหาอยู่ในตำแหน่งอื่น ค้นหาด้วยคำสั่งนี้:

ls -l /tmp/mysql.sock /var/mysql/mysql.sock

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

หากคุณมี/tmp/mysql.sockแต่ไม่/var/mysql/mysql.sockแล้ว ...

cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /tmp/mysql.sock mysql.sock

หากคุณมี/var/mysql/mysql.sockแต่ไม่/tmp/mysql.sockแล้ว ...

cd /tmp
ln -s /var/mysql/mysql.sock mysql.sock

คุณจะต้องมีสิทธิ์ในการสร้างไดเรกทอรีและลิงค์ดังนั้นเพียงแค่นำหน้าคำสั่งข้างต้นด้วย sudo หากจำเป็น


คำตอบที่ดี. แก้ไขได้ผลสำหรับฉัน คุณรู้ไหมว่าทำไมมันถึงได้ผลครั้งเดียวแล้วไม่ทำงานอีกครั้ง? ฉันมีปัญหาเดียวกัน
Nicole

16
มันค่อนข้างแฮ็ค ฉันค่อนข้างจะแนะนำคำตอบ @luismreis เพื่อหลีกเลี่ยงทางลัด MySQL ที่ซ่อนอยู่
MattiSG

2
ไม่ได้ผลสำหรับฉัน ... ฉันไม่มีไฟล์เหล่านี้เลย แต่คำตอบของ luismreis นั้นใช้ได้ผล!
Gregoire

4
นี่ไม่ใช่ "แฮ็ค" นี่เป็นวิธีที่ถูกต้องในการทำให้localhostซ็อกเก็ตทำงานและอาจมีความสำคัญหากคุณไม่ต้องการให้โอเวอร์เฮดพิเศษส่งแพ็กเก็ตไปยังเราเตอร์ก่อนเข้าถึงฐานข้อมูล
Kebman

1
เส้นทางใน Ubuntu 10.04 ของฉันไม่ถูกต้อง ผมต้องทำนี้แล้ว:cd /tmp sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock
franzlorenzon

371

ฉันยังมีข้อผิดพลาดนี้ แต่อาจจะแก้ไขมันผ่านข้อเสนอแนะที่นี่

ในการสรุปให้ใช้:

127.0.0.1

แทน:

localhost

เหตุผลก็คือ "localhost" เป็นชื่อพิเศษสำหรับไดรเวอร์ MySQL ทำให้ใช้ซ็อกเก็ต UNIX เพื่อเชื่อมต่อกับ MySQL แทนที่จะเป็นซ็อกเก็ต TCP


1
หากวิธีนี้ใช้งานได้ให้ตรวจสอบhostsไฟล์ของคุณมันอาจจะหายไปหรือทำให้ยุ่งเหยิง
Fabrizio

3
ก็อาจจะดีที่จะพูดถึง: เมื่อใช้ MAMP เช่นฉันคุณต้องยกเลิกการทำเครื่องหมายในช่อง "อนุญาตการเข้าถึงในท้องถิ่นเท่านั้น"
soupdiver

วิธีแก้ปัญหานี้ทำให้ค่าใช้จ่ายเพิ่มเป็นพิเศษเนื่องจากเราเตอร์ส่งแพ็กเก็ตก่อน มักจะไม่ใช่ปัญหาใหญ่ในขณะทดสอบ แต่อาจเป็นปัญหากับแพ็กเก็ตข้อมูลขนาดใหญ่
Kebman

3
@Fabrizio ไม่ไม่เกี่ยวข้อง เมื่อคุณใช้ localhost เป็นชื่อ mysql จะใช้ซ็อกเก็ต Unix แทนที่จัดการผ่านรายการไฟล์ (ตัวอย่างเช่น mysql.sock) ไม่ใช่ Inet one ไม่ว่าจะประกาศ localhost ใน / etc / hosts หรือไม่ก็ตาม อย่างไรก็ตามเมื่อคุณใช้ที่อยู่ IP แทนแม้แต่ 127.0.0.1 คุณบังคับให้ mysql เปิดซ็อกเก็ต Inet แทน
Fran Marzoa

1
สิ่งนี้หมายความว่าทุกสิ่งที่คุณให้ไว้บนฐานข้อมูล MySQL ไปยัง 'user'% 'localhost' จะแตกหรือไม่
Octopus

24

ฉันมีปัญหาเดียวกันและนี่คือวิธีที่ฉันแก้ไข:

ฉันมีสิ่งนี้และมันไม่ทำงาน:

$con = mysql_connect('localhost', 'root', '1234');

ฉันทำสิ่งนี้และใช้งานได้:

$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');

แทนที่จะใช้เซิร์ฟเวอร์ mysql ฉันเชื่อมต่อโดยตรงกับ Unix Socket ทำงานให้ฉัน


นี่เป็นทางออกเดียวที่ทำงานสำหรับฉันด้วย ฉันไม่มี /var/mysql/mysql.sock และฉันไม่มี /tmp/mysql.sock
JeffB6688

คุณลอง 127.0.0.1 แทน localhost ไหม?
Mantisse

21

ซ็อกเก็ต MySQL ตั้งอยู่โดยทั่วไปใน/tmp/mysql.sockหรือ/var/mysql/mysql.sockแต่อาจ PHP ดูผิดที่

  1. ตรวจสอบซ็อกเก็ตของคุณด้วย:

     sudo /usr/libexec/locate.updatedb
  2. เมื่อ updateb ถูกยกเลิก:

     locate mysql.sock
  3. จากนั้นค้นหา php.ini ของคุณ:

     php -i | grep php.ini

    สิ่งนี้จะให้ผลลัพธ์เช่น:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. แก้ไข php.ini ของคุณ

     sudo vim /opt/local/etc/php54/php.ini
  5. เปลี่ยนสาย:

     pdo_mysql.default_socket=/tmp/mysql.sock
     mysql.default_socket=/tmp/mysql.sock
     mysqli.default_socket = /tmp/mysql.sock

    โดยที่ /tmp/mysql.sock เป็นพา ธ ไปยังซ็อกเก็ตของคุณ

  6. บันทึกการแก้ไขของคุณและออกจาก ESC + SHIFT: x

  7. รีสตาร์ท Apache

     sudo apachectl stop
     sudo apachectl start

ฉันไม่มี php.ini; ฉันมี php.ini.default เพียงอย่างเดียวดังนั้นจึงปรากฏว่าการแก้ปัญหาที่นี่มีความจำเป็น: apple.stackexchange.com/questions/65802/… อย่างไรก็ตามมันไม่ได้ผลสำหรับฉัน
user124384

@ user124384 การติดตั้งของคุณอาจเสีย: เปลี่ยนชื่อของคุณจะphp.ini.default php.ini
คำนาม

Apache สามารถเริ่มใหม่ได้ด้วยบรรทัดเดียว:sudo apachectl restart
fbiazi

11

ฉันอยู่ใน XAMPP บน Mac OS X และวิธีการแก้ปัญหาของไบรอันโลว์ทำงานข้างต้นด้วยการปรับเปลี่ยนเล็กน้อย

ไฟล์ mysql.sock นั้นอยู่ในโฟลเดอร์ "/ Applications / xampp / xamppfiles / var / mysql /" ดังนั้นต้องเชื่อมโยงมันทั้งใน / tmp และ / var / mysql ฉันไม่ได้ตรวจสอบว่าบรรทัดใดที่ใช้โดยบรรทัดคำสั่ง PHP แต่การแก้ไขนี้ทำให้ฉันมีความสุข :-)

sudo su
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock
mkdir /var/mysql
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /var/mysql/mysql.sock

1
ty - ฉันค้นหาคำตอบไม่กี่วันและนี่คือสิ่งที่ทำให้สิ่งที่ถูกต้องในที่สุด! =) XAMPP บน OS X ด้วย
ljubiccica

10

Mac OS X EL Capitan + MAMP Pro ทำสิ่งนี้

cd /var
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

จากนั้นทำเช่นนี้

cd /tmp
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

หวังว่านี่จะช่วยคุณประหยัดเวลา


มันเชื่อมโยงmysql.dockส่วน/tmpที่แก้ไขมัน ขอบคุณ!
Mohammed J. Razem

6

เหตุผลก็คือว่า PHP mysql.sockไม่สามารถหาเส้นทางที่ถูกต้องของ

โปรดตรวจสอบให้แน่ใจว่า mysql ของคุณทำงานก่อน

จากนั้นโปรดยืนยันว่าเส้นทางใดที่mysql.sockตั้งอยู่ตัวอย่างเช่น/tmp/mysql.sock

จากนั้นเพิ่มสตริงพา ธ นี้ไปที่ php.ini:

  • mysql.default_socket = /tmp/mysql.sock
  • mysqli.default_socket = /tmp/mysql.sock
  • pdo_mysql.default_socket = /tmp/mysql.sock

ในที่สุดรีสตาร์ท Apache


6

เมื่อคุณประสบปัญหาต่อไปนี้:

ข้อผิดพลาดในการขว้าง PHP "คำเตือน: mysql_connect () http: //function.mysql-connect : 2002 ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว (พยายามเชื่อมต่อผ่าน unix: ///tmp/mysql.sock)"

ตั้งค่า "mysql.default_socket" ในของคุณ/etc/php.iniเป็น

 "mysql.default_socket = /var/mysql/mysql.sock". 

จากนั้นเริ่มบริการเว็บใหม่ในผู้ดูแลเซิร์ฟเวอร์


นี่เป็นคำตอบที่ดีที่สุดสำหรับฉัน - ในกรณีของฉันฉันใช้ MAMP ฉันเพิ่ม php.ini ของฉัน: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski

3

แก้ไขข้อผิดพลาดซ็อกเก็ต 2002 ที่ปรากฏ - ซึ่งเชื่อมโยงตำแหน่งที่ MySQL วางซ็อกเก็ตและที่ที่ OSX คิดว่าควรจะเป็น, MySQL วางไว้ใน / tmp และ OSX ค้นหามันใน / var / mysql ซ็อกเก็ตเป็นไฟล์ประเภทหนึ่งที่ช่วยให้ลูกค้า mysql การสื่อสารเซิร์ฟเวอร์ /

sudo mkdir /var/mysql

แล้ว

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

แหล่งที่มา: http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/


1

อีกวิธีหนึ่งคือแก้ไขตำแหน่งซ็อกเก็ตในไฟล์กำหนดค่า php.ini ดังนี้

pdo_mysql.default_socket=/tmp/mysql.sock

แน่นอน symlink ก็ทำงานเช่นกันดังนั้นมันเป็นเรื่องของการตั้งค่าที่คุณเปลี่ยน


1

เมื่อคุณติดตั้ง php53-mysql โดยใช้พอร์ตจะส่งคืนข้อความต่อไปนี้ซึ่งเป็นวิธีแก้ปัญหานี้:

To use mysqlnd with a local MySQL server, edit /opt/local/etc/php53/php.ini
and set mysql.default_socket, mysqli.default_socket and
pdo_mysql.default_socket to the path to your MySQL server's socket file.

For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock

ฉันใช้ Mountain Lion และติดตั้ง MySQL โดยใช้ macports
Sheric

1

ฉันมีปัญหาเดียวกัน

[PDOException] SQLSTATE [HY000] [2002] ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

[ErrorException] คำเตือน: PDO :: __ สร้าง (): [2002] ไม่มีไฟล์หรือไดเรกทอรี (พยายามเชื่อมต่อผ่าน unix: ///var/mysql/mysql.sock) ใน… htdocs / Symfony / ผู้ขาย / doctrine-dbal / lib / ปรัชญา / DBAL / ไดรเวอร์ / PDOConnection.php

ดังนั้นทางออกคือการสร้าง symlink ให้กับไฟล์ sock ซึ่งเป็นการแก้ไขปัญหา ทำสิ่งต่อไปนี้เพื่อแก้ไข:

$ sudo mkdir / private / var / mysql /

$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /private/var/mysql/mysql.sock

แหล่งที่มา: http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql-while-browser-works-fine/


โพสต์คำตอบของคุณที่นี่แทนที่จะลิงค์ไปยังเว็บไซต์ภายนอก
ElmerCat

0

ฉันได้รับข้อผิดพลาดเดียวกัน Mysql ทำงานเป็นแอปพลิเคชันแบบสแตนด์อโลนก่อนที่ฉันจะเริ่ม phpMyAdmin

ฉันเพิ่งหยุด mysql แล้ว sudo / Applications / XAMPP / xamppfiles / xampp หยุด sudo / Applications / XAMPP / xamppfiles / xampp start

มันใช้งานได้ดี


0

ฉันเพิ่งพบปัญหานี้ แต่ปรากฏเฉพาะเมื่อโหลดบางหน้า (หน้าอื่นทำงานได้ดี) มันกลับกลายเป็นว่าผมได้รับการโทรไปยัง MySQL mysql_close()หลังจากที่ฉันปิดการเชื่อมต่อกับ ดังนั้นเป็น @brucenan กล่าวว่า: ให้แน่ใจว่า MySQL จะทำงานเมื่อคุณเรียกมันว่า


0

คุณสามารถทำได้โดยเพียงแค่นามแฝง MAMP php บนเทอร์มินัลของ Apple:

alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'

ตัวอย่าง: > phpmamp - v

ตอนนี้คุณสามารถเรียกใช้บางสิ่งเช่น: > phpmamp scriptname.php

หมายเหตุ: สิ่งนี้จะใช้สำหรับเซสชันเทอร์มินัลปัจจุบันเท่านั้น


0

เนื่องจากคุณอาจใช้ MAMP เปลี่ยนพอร์ตของคุณเป็นค่าเริ่มต้น 3306 หรือใช้ 127.0.0.1 ใน database.php

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',// leave it for port 3306
    'username' => 'yourUserhere',
    'password' => 'yourPassword',
    'database' => 'yourDatabase',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

หรือด้วยการตั้งค่าเริ่มต้น:

$db['default'] = array(
        'dsn'   => '',
        'hostname' => '127.0.0.1:8889',// leave it for port 8889
        'username' => 'yourUserhere',
        'password' => 'yourPassword',
        'database' => 'yourDatabase',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );

0

ไคลเอนต์ mySQL โดยค่าเริ่มต้นพยายามเชื่อมต่อผ่านไฟล์ภายในเครื่องที่เรียกว่าซ็อกเก็ตแทนที่จะเชื่อมต่อกับที่อยู่ลูปแบ็ค (127.0.0.1) สำหรับโลคอลโฮสต์

ที่ตั้งเริ่มต้นของไฟล์ซ็อกเก็ตนี้อย่างน้อยใน OSX /tmp/mysql.sockเป็น

วิธีแก้ปัญหาที่รวดเร็วน้อยและรวดเร็ว

สร้าง symlink เพื่อหลอกระบบปฏิบัติการให้ค้นหาซ็อกเก็ตที่ถูกต้อง

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp

โซลูชั่นที่เหมาะสม

เปลี่ยนเส้นทางซ็อกเก็ตที่กำหนดไว้ในแฟ้มในstartMysql.sh/Applications/MAMP/bin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.