Kafa karıştırıcı PDO-tek sorun: soket üzerinden bağlanmak değil mi / Erişim 't sunucusuna bağlanmak Can / yalanladı (paylaşılan bir bilgisayar)

11 Cevap php

Yani sorun, ben birisi bana cevap sorusunu düzenledikten sonra oldu gibi cevaplar kötü değerlendirmeleri önlemek için aşağıdaki özgün soru bırakacağım, ne olduğunu değiştirildi:

So I am working on a (really lame) shared hosting which has PDO installed, but it doesn't work. With default parameters

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

Bu mesaj atar:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Basit bir mysql_connect ile çalışır.

Ve soket yolu Phpinfo ve bu sorgu, hem de (doğru görünüyor:

show variables like 'socket';

onaylayın.

Localhost 10.103.0.14 yönlendirir (bu veri (mysql_get_host_info gelir) ve phpMyAdmin)

PDO, i 127.0.0.1 tarafından localhost yerine eğer ben alacak

SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (111) 

Ve eğer ben 10.103.0.14 tarafından localhost değiştirin:

Access denied for user 'USER_NAME'@'10.103.0.14' (using password: YES

Hem IP adresi (127.0.0.1 ve 10.103.0.14) mysql_connect ile çalışır.

Yani görünüşe göre sorun PDO bağlantısı geliyor.

Biri bu gelebilir bilir nerede, ya da / ve bunu düzeltmek için herhangi bir yolu var mı?

Bazı sunucu veriler:

The PHP Version : 5.2.10 You can see the server's phpinfo : http://web.lerelaisinternet.com/abcd.php?v=5 No command line possible. (i know it should be the tech suport's job, but they're reaaaaaly slow)

Teşekkürler

Önceki soru:

How to find the mysql.sock on a shared host (tricky way needed...)

So today's problem is : The PDO connection doesn't work on a shared host, and it's supposed to (it's installed on the server). Just a basic PDO connection :

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

Bu mesaj atar:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Normal bir mysql bağlantısı:

mysql_connect("localhost", "THE_USER", "THE_PWD") or die(mysql_error()); 
mysql_select_db("24DLJLRR1") or die(mysql_error());;
echo 'Connected to database <br/>';

gayet iyi çalışıyor.

So apparently it cannot find the .sock. I think specifying the correct address should work, i tried some "classic" mysql path that I found on internet, without success. The phpinfo says it is at this adress (/var/lib/mysql/mysql.sock) (The PHP Version is 5.2.10) You can see the server's phpinfo : http://web.lerelaisinternet.com/abcd.php?v=5

So i am trying to figure out where the hell it is !!! I tried to look in the phpMyAdmin interface, but i couldn't find the info, plus it seems that phpMyAdmin connects to a different server (it has a different IP adress, and trying to connect to it with php gives a "Wrong password" error). The mysql_connect also connects to this adress, i think it redirects to a different server with some internal password/login.

Well if you have any idea of how to obtain this info (the provider's technical support is "fixing the problem"... it's been 1 month...). Also maybe the problem comes from somewhere else, but the same stuff works on other shared hosts...

Ben bu web sitesi için Doktrini ile Symfony çerçevesini kullanmak ve Doktrin eklenti PDO gerektiğinden PDO'nun ihtiyacıdır ... Ben sıfırdan web yinelemek istemiyorum!

Teşekkürler for your help !

11 Cevap

This was already marked as answered, but not really solved (without changing databases). So, just in case someone like me also experiences this problem...

) Phpmyadmin veya konsol (veya mysql veya mysqli'nin içinde inşa: Bunu düzeltmek için en kolay yolu, ilk php.ini dosyasına bakarak kullanarak veya (soket yolunu almak için

... Aşağıdaki sorgu (PDO şey ama) çalıştırmak için:

show variables like 'socket';       //as mentioned by symcbean

SONRA, PDO bağlantı dizesinde, bunun yerine bir hostname soketi kullanmak için değiştirin:

$dbc = new PDO("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=$DBName", $User, $Password, array(PDO::ATTR_PERSISTENT => true)); // using persistent connections

Bu benim için çalıştı.

FWIW, bu sorunu vardı ve '127 .0.0.1 'ile' localhost 'benim ana değiştirdi.

Ben localhost çalışmıyor neden hiçbir ipucu var, ama bu hile yaptı.

Tek şey, biz sunucuları ton var, ve bu 'localhost' kullanarak neredeyse her biri üzerinde çalışır

Eğer yerine sunucu adı olarak 127.0.0.1 deneyebilirsiniz localhost?

IIRC, bazı mySQL sürücüler / adaptörleri ile, bu soket bağlantısı kurulurken veya kullanılır karar verir.

Çalışır bağlantıyı kullanarak, sorguyu çalıştırın:

show variables like 'socket';

(Bu sadece bir select deyimi gibi davranır) ... ve çalışan soket yolunu alırsınız.

Ardından dosya izinlerini denetleyin.

I had the problem that production version worked just fine and a test version wasn't able to connect PDO :/ both versions was located at same servers, test in a sub directory.

Düzeltme DSN ip için localhost yerine edildi.

'mysql:host=localhost;dbname=db'

oldu

'mysql:host=127.0.0.1;dbname=db'

deneyin:

exec('`which mysql_config` --socket');

Bu size yapılandırılmış yuvasını göstermelidir.

Selinux ile çalışan sunucu etkindir (zorlama)? Eğer durum bu ise, root olarak çalıştırmayı deneyin:

# setsebool -P httpd_can_network_connect on

Ben garip davranışın nedenini bulundu. Bind-adres 127.0.0.1 veya 0.0.0.0 (tüm adresler) farklı ise PDO 127.0.0.1 bağlanamıyor.

Ben sadece benzer bir sorunu çözüldü. Benim tahminim muhtemelen PDO eşdeğeri ile mysql_connect () deyimi ile değiştirilebilir. Hala o eski bağlantı tablosuna bağlı diğer kod çok var unutma. PDO kod yazarken yerine mysql_connect tutarak deneyin.

Bu değer ne için, ben aynı sorunu yaşıyorum sonra bu sayfa bulundu. Ben Apache & çalıştıran bir sunucu üzerinde duyuyorum PHP sadece - MySQL başka bir makinede yüklü. Ben DNS sunucusunun adını ve IP hem çalıştı ve bunu ping doğruladı. Aynı makinede bir PHP uygulaması eski sözdizimi mysql_connect () kullanarak, veritabanı cezasına konuşuyor. Ama CLI'den PDO bu hatayı atma oldu.

Benim için çözüm benim DSN kontrol etmek oldu. Any typo in the DSN itself is ignored silently, and PDO assumes you mean localhost. Benim sorun vardı "name =" yerine "dbname =" DSN.

Bir yıl sonra, ben bir barındırılan sunucu bu soruna yönelik bir çözüm bulundu: Bir SQLite veritabanı (PDO çalışıyor, ancak MySQL ile) sorunu sabit kullanarak