Apache mysqli ve PDO hem de desteklemek için ne gerekir?

5 Cevap php

Ben (PDO sözdizimi bana daha mantıklı ve veritabanı-agnostik olduğu için) PDO veritabanı erişimi yerine mysqli için kullanmak bazı PHP kodunu değiştirmeyi düşünüyorum. Bunu yapmak için, ben değişiminin yapıyorum iken çalışmaya her iki yöntem gerekiyordu.

Benim sorunum şu: so far, either one or the other method will crash Apache.

Sağ şimdi Windows XP'de XAMPP kullanarak ve PHP Sürüm 5.2.8 ediyorum. Mysqli çalışıyor ve böylece bu yapar:

$dbc = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
echo 'Connected to database';
$sql = "SELECT * FROM `employee`";

Ama bu çizgi Apache kazasında yapar:

$dbc->query($sql);

Ben tüm Apache veya XAMPP kurulumu yinelemek istemiyorum, ama PDO çalışmak için ben isterim. Bu yüzden oddvibes tavsiye edildiği gibi, libmysql.dll here ikinci güncelleme here çalıştı. O benim basit PDO sorgu çalışma yapılmış, ancak daha sonra mysqli sorguları Apache çöktü.

(Ben de hiçbir etkisi, php_pdo_mysql.dll ve php_pdo.dll güncellemek için, ondan sonra öneri denedim.)

Test Case

Ben mysqli'nin vs PDO'yu karşılaştırmak için bu test komut dosyası oluşturulur. $use_pdo doğruysa ve bu düzmece değilse eski kopyası ile libmysql.dll, çöker. Yeni kopya ile libmysql.dll, bu tam tersi.

if ($use_pdo){
  $dbc = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
  echo 'Connected to database<br />';
  $sql = "SELECT * FROM `employee`";
  $dbc->query($sql);
  foreach ($dbc->query($sql) as $row){
    echo $row['firstname'] . ' ' . $row['lastname'] . "<br>\n";
  }

}
else {
  $dbc = @mysqli_connect($hostname, $username, $password, $dbname) OR die('Could not connect to MySQL: ' . mysqli_connect_error());
  $sql = "SELECT * FROM `employee`";
  $result = @mysqli_query($dbc, $sql) or die(mysqli_error($dbc));

  while ($row = mysqli_fetch_array($result,MYSQLI_ASSOC)) {
    echo $row['firstname'] . ' ' . $row['lastname'] . "<br>\n";
    }
}

What does Apache need in order to support both methods of database query?

5 Cevap

Değil doğrudan bir cevap, ama belki bunun için arama size yardımcı olabilir:

Eski mysql uzantısı (öneki fonksiyonu mysql_) libmysqlclient üzerinde ince bir sarıcı. Yeni mysqli uzantısı aslında aynı olduğunu, ancak libmysqlclient sonraki sürümlerinde tanıtıldı bazı işlevler uygular. PDO da libmysqlclient kullanır, ancak doğrudan diğer uzantıları yapmak olarak eşleşmiyor. Bu, tüm aynı yerel kütüphane başvurmak 3 farklı php-uzantıları tutarındadır. Bazıları kütüphane sürümü hakkında varsayımlar yaparsanız, onları çatışmaya neden olabilir.

Seni bulmak ve (zaten değil varsa) eski mysql uzantısını devre dışı bırakmak için deneyebilirsiniz libmysqlclient.dll en yeni sürümünü yüklemek öneririm.

Eğer mysql uzantısı kullanan kodu varsa, bu işlevlere mysqli bağlamak olabilir ve aynı çalışması gerekir.

Ayrıca, yeni mysqlnd sürücü nedense yüklü olmadığından emin olun. mysqlnd libmysqlclient alternatif bir uygulama olduğunu ve gerçekten sadece her şeyi daha da karmaşık hale getirir.

Evet, büyük bir karmaşa var.

İhtiyacınız olan tüm extension=php_mysqli.dll ve extension=php_pdo_mysql.dll gibi php.ini doğru extension direktifleri, uncomment gibi görünüyor.

Ben onunla sinirli ve bireysel Apache, PHP ve MySQL yüklemeye karar verdim çünkü ben XAMPP ile onaylamıştır asla. Süreçte, ben başka şeyler bir sürü ile birlikte, yukarıdaki adımları yapmak için öğrendim. Yani bu XAMPP ile çalışacak doğruladı değil, ama doğru sürücüleri ile gelmiyor sürece, neden görmüyorum.

Yukarıdaki örnekte direktiflerde iki sürücüleri (. Dll dosyaları) Ben kullanıyorum olanlardır. Eğer php uzantıları dizine emin yolu noktaları yapmak gerekir - Ben de extension_dir = "c:/php/ext" in php.ini set. (Ayrı ayrı bu bileşenlerin yüklenmesi ile ilgili güzel şeylerden biri ben yerine derin çeşitli düzeylerde gömülü olan c:\php PHP koyabilirsiniz olduğunu unutmayın c:\xampp.)

Herkes ayrı ayrı sunucu bileşenlerini yükleme ile birlikte takip etmek istiyorsa, ben documented the whole process, with screenshots, benim blog.

http://stackoverflow.com/questions/1258294/why-does-this-pdomysql-code-crash-on-windows ile aynı

ancak şu an için bir çözüm var yok

Crash sadece sorgu ("xxx" SELECT * FROM olur) ve hazırla / yürüt

Ben buldum tek çözüm:

5.0.51a paket DAN libmysql.dll yükleyin (son 5.1.44 MySQL Version ile çalışan)

http://www.netfulvpc.fr/files/libmysql_dll.zip

Tamam, ben çok kötü bir çalışma var ama çözüm: p)

Bir Hex Editor ile açık ext \ php_pdo_mysql.dll

"83 C3 50" ara (php 5.2.12 VC6 içinde) 0x000024d5 ofset

83 C3 "54" ile değiştirin

Sorun kötü bir yapı boyutu ... (struct pdo_column_data)

Ben libmysql.dll bu düzeltmeye çalıştı ama o kaza php_mysqli ;)