PHP MySQL sorgusu MySQL / Apache Error

11 Cevap php

Ben şu hatayı alıyorum:

Erişim @ user 'apache' için reddedildi (şifrenizi kullanarak: NO) 'localhost'

Aşağıdaki kodu kullanırken:

<?php

include("../includes/connect.php");

$query = "SELECT * from story";

$result = mysql_query($query) or die(mysql_error());



echo "<h1>Delete Story</h1>";

if (mysql_num_rows($result) > 0) {
while($row = mysql_fetch_row($result)){
echo '<b>'.$row[1].'</b><span align="right"><a href="../process/delete_story.php?id='.$row[0].'">Delete</a></span>';
echo '<br /><i>'.$row[2].'</i>';
}
}
else {
echo "No stories available.";
}

Connect.php dosya benim MySQL yazılımı başka bir kısmında benim INSERT sorgu ile iyi çalışıyor çağrı bağlanmanızı içerir. Ben $ result = mysql_query satır açıklama ise, o zaman başka açıklamaya geçer. Yani, o hattı veya IF içeriğidir.

Ben herhangi bir çözüm için net arama edilmiş ve en çok MySQL bağlantıları ya da ilişkili görünmektedir ben izni yok gibi MySQL içine giriş ediyorum kullanıcı. Ben de kontrol ettik. Hala başka yazılım benim diğer sorguları gerçekleştirebilir, ve ben hesap doğru izinlere sahip olduğunu doğruladıktan.

Ben bütün gün bu kod küçük bloğunda bakıyordu edilmiş olarak ben sadece bir dış perspektif gerekir düşünüyorum.

Daha fazla bilgi gerekiyorsa, sadece bana bildirin.

11 Cevap

O da bütün bu konularda eğer, apache @ localhost ben veritabanına girmek için kullandığınız kullanıcı hesabının adı değil. Ben herhangi bir kullanıcı bu konuda hiç onlara isim apache ile hesapları yok.

O apache @ localhost 'diyerek Eğer kullanıcı adı MySQL bağlantısının doğru geçirilen almıyor. 'Apache' normalde httpd süreci (en azından Redhat tabanlı sistemlerde) çalışır ve hiçbir kullanıcı adı bağlantı sırasında geçirildiği takdirde MySQL bağlantısı için çağırıyor kişiye kullandığı kullanıcı.

Eğer sağ komut bağlantı yaparsanız, bir denilen dosyada, aynı hatayı alıyorum değil?

Gerektiren () dahil Değişiklik (). If the "connect.php" file can't be require()d, the script will fail ölümcül bir hata ile, oysa include() only generates a warning. Eğer mysql_connect için geçen konum adı () "apache" değilse, bağlantı komut dosyası için yanlış bir yol hata bu tür almak için en yaygın yoludur.

Veritabanı hatası günlüklerini kontrol etmeyi unutmayın. Eğer bile DB isabet olup olmadığını görmek gerekir. Eğer değilseniz, size kutunun üzerinde güvenlik duvarı kurallarını kontrol etmelisiniz. Bir linux kutusunda Eğer güvenlik duvarı liste kuralları almak için iptables-L çalıştırabilirsiniz.

Aksi takdirde bir saf erişim sorunu olacaktır. Do bir apache kullanıcı bile orada kurulmuş olup olmadığını görmek için "mysql.user seçin *". Ayrıca, ben apache kullanarak karşı varsayılan olarak apache gibi oluşturduğunuz herhangi başka bir uygulama çalışacak beri, app için özel bir hesap oluşturmanızı tavsiye ederim, ve db yetkisiz erişim alabilir.

Sadece daha fazla bilgi almak için documentation@dev.mysql.com in "GRANT" bakmak. Eğer db ile ilgili daha spesifik questiosn varsa, sadece soruyu düzenlemek, ve ben bir bakacağız.

Connect.php aslında script bağlantı yapmak mı yoksa sadece bir bağlantı oluşturmak için aramak gerekiyor bir fonksiyon tanımlıyor? Eğer alıyorsanız hata hiç bir önceden kurulmuş bağlantısı olmaması belirtisidir.

ETA: Ayrıca bir gerektiren bulunmaktadır değiştirin. Ben aslında tüm dosyası dahil değil sanıyorum. Ama dahil sessizce başarısız olabilir.

Cevabını Dostum büyük bir DUH olduğunu! -ne yazık ki o da anlamaya biraz zaman aldı. Muhtemelen dbconnect gibi bir işlevi () varsa ve bağlantı yapmak için bir içerme dosyası değişkenleri kullanıyor. $ Conn = mysql_connect ($ dbhost, $ dbuser, $ DBPASS).

Peki bu bir işlev içindeki değişkenler olduğu işleve geçirilmesi gereken ya da başka bir fonksiyon $ dbhost, $ dbuser ve $ DBPASS ne olduğunu bilemezsiniz dosyası içerir. Bunu düzeltmek için bir yolu böylece işlevleri onları alabilirsiniz bu değişkenleri küresel yapmaktır. Çok güvenli değil başka bir çözüm size ev sahibi, kullanıcı yazmak ve mysql_connect fonksiyonu geçmek olacaktır.

Bu yardımcı olur ama aynı sorun vardı umuyoruz.

Eğer bir hata alıyorum just Bu bölümü kullanırsanız, sadece kontrol etmek?

<?php
include("../includes/connect.php");

$query = "SELECT * from story";

$result = mysql_query($query) or die(mysql_error());

Eğer öyleyse, yine kopyalamak bir hata alırsınız ve bu sayfanın içine bu Eklemelerin birini yapıştırın, ben bu sayfa veya fiili hattına yerel olmadığını görmek için çalışıyorum.

Ekler bu örnekte tam olarak aynı sözdizimini kullanın sürece ayrıca, bağlantı çağrıları (eksi parola) bir kopyasını gönderebilirsiniz.

Apache kullanıcı veritabanına bağlanmak için bir parola gerektirir mi? Eğer öyleyse, o diyor aslında "şifrenizi kullanarak: HAYIR" kod şifre olmadan bağlanmaya çalışıyor inanmak için bana yol açacak.

Ancak, apache kullanıcı bir parola gerektirmez, eğer, izinleri bir çift kontrol (zaten işaretli sözü) iyi bir fikir olabilir. Hala bir mysql isteminde böyle bir şey yürütme denemek için yararlı olabilir:

GRANT ALL PRIVILEGES ON databasename .* to 'apache'@'localhost';

Bu sözdizimi doğru olmalıdır.

Bunun dışında, ben sadece senin kadar stumped.

Gerçekten size aynı bağlantı çağrılarını kullanarak eklemek mümkün iseniz, sorun büyük olasılıkla veritabanında SELECT izinlerine sahip değil kullanıcı "apache" yatıyor. Eğer phpMyAdmin yüklü varsa Ayrıcalıklar bölmesinde kullanıcı için izinleri bakabilirsiniz. phpMyAdmin de çok kolay izinlerini değiştirmek için yapar.

Sadece komut satırına erişiminiz varsa, mysql veritabanından izinlerini kontrol edebilirsiniz.

Muhtemelen gibi bir şey yapmak gerekir:

GRANT SEÇİMİ AÇIK myDatabase.myTable TO 'apache' @ 'localhost';

Sen aşağıdakilerden birini yapabilirsiniz:

  • Bu phpmyadmin den ayrıcalıkları bulunuyor veya bir kabuk üzerinde mysql kullanarak kullanıcı "apache" ve kurulum ekle
  • Php.ini dosyasında mysql.default_user bakmak, başka bir kullanıcı, zaten ayrıcalıkları gerekli olan birisi (belki ama root) olarak bağlayın .. mysql çalıştırmak için php söyle.

Eğer bir hata alıyorum sadece bu bölümü kullanırsanız, sadece kontrol etmek?

Eğer öyleyse, yine kopyalamak bir hata alırsınız ve bu içine bu Eklemelerin birini yapıştırırım> sayfasında, bu sayfa veya fiili hattına yerel olmadığını görmek için çalışıyorum.

Uçlar> Bu örnekte tam olarak aynı sözdizimini kullanın sürece ayrıca, bağlantı çağrıları (eksi parola) bir kopyasını gönderebilirsiniz.

İşte connection.php dosyasında budur. Ben başka bir yerde kodu INSERT sorguları yürütmek nereye kadar aynı şekilde dahil yoluyla dosyasına bağlı.

    $conn = mysql_connect("localhost", ******, ******) or die("Could not connect");

    mysql_select_db("adbay_com_-_cms") or die("Could not select database");

Bunu kontrol etmek için bu alanda çalışan INSERT sorgusu çalışacağız.

Olarak başkalarının şifre erişimi hakkında gönderme. Benim ilk gönderme, onay ve izinlerin belirtildiği gibi, yaptım. Ben kullanıyordum kullanıcı hesabının izinleri doğru olduğunu doğrulamak için phpMyAdmin kullanılır. O da bütün bu konularda eğer, apache @ localhost ben veritabanına girmek için kullandığınız kullanıcı hesabının adı değil. Ben herhangi bir kullanıcı bu konuda hiç onlara isim apache ile hesapları yok.

Yapmanız hatırladınız mı:

flush privileges;

Kullanıcı kurmak değilse o 'apache' verecek @ 'localhost' hatası.