سؤال

اتلقى الخطأ التالي:

تم رفض الوصول للمستخدم "Apache"@"localhost" (باستخدام كلمة المرور:لا)

عند استخدام الكود التالي:

<?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 يحتوي الملف على مكالمات MySQL Connect التي تعمل بشكل جيد مع My INSERT الاستعلامات في جزء آخر من البرنامج.إذا قمت بالتعليق على $result = mysql_query السطر، ثم ينتقل إلى بيان آخر.لذلك، هذا هو السطر أو المحتوى الموجود في if.

لقد كنت أبحث في الإنترنت عن أي حلول، ويبدو أن معظمها مرتبط بعدد كبير جدًا من اتصالات MySQL أو أن المستخدم الذي أقوم بتسجيل الدخول إلى MySQL ليس لديه إذن.لقد راجعت كليهما.لا يزال بإمكاني إجراء استعلاماتي الأخرى في مكان آخر في البرنامج، وقد تأكدت من أن الحساب لديه الأذونات الصحيحة.

هل كانت مفيدة؟

المحلول

وإذا كان الأمر مهمًا على الإطلاق، فإن apache@localhost ليس اسم حساب المستخدم الذي أستخدمه للدخول إلى قاعدة البيانات.ليس لدي أي حسابات مستخدمين تحمل اسم apache على الإطلاق في هذا الشأن.

إذا كان يقول "Apache@localhost"، فلن يتم تمرير اسم المستخدم بشكل صحيح إلى اتصال MySQL.عادةً ما يكون "Apache" هو المستخدم الذي يقوم بتشغيل عملية httpd (على الأقل في الأنظمة المستندة إلى Redhat) وإذا لم يتم تمرير اسم مستخدم أثناء الاتصال، يستخدم MySQL من يتصل بالاتصال.

إذا قمت بالاتصال بشكل صحيح في البرنامج النصي الخاص بك، وليس في ملف تم استدعاؤه، فهل تحصل على نفس الخطأ؟

نصائح أخرى

قم بتغيير التضمين () إلى يتطلب (). إذا كان ملف "connect.php" لا يمكن أن يكون require()d، فسوف يفشل البرنامج النصي مع وجود خطأ فادح، في حين include() يُنشئ تحذيرًا فقط.إذا كان اسم المستخدم الذي تمرره إلى mysql_connect() ليس "Apache"، فإن المسار غير الصحيح إلى البرنامج النصي للاتصال هو الطريقة الأكثر شيوعًا للحصول على هذا النوع من الأخطاء.

لا تنس التحقق من سجلات أخطاء قاعدة البيانات الخاصة بك.يجب أن تكون قادرًا على معرفة ما إذا كنت قد وصلت إلى قاعدة البيانات أم لا.إذا لم تكن كذلك، فيجب عليك التحقق من قواعد جدار الحماية لديك الموجودة على العلبة.في نظام التشغيل Linux، يمكنك تشغيل iptables -L للحصول على قواعد قائمة جدار الحماية.

وإلا فستكون مشكلة وصول خالصة.قم بإجراء "select * from mysql.user" لمعرفة ما إذا كان مستخدم Apache قد تم إعداده هناك.علاوة على ذلك، أوصي بإنشاء حساب مخصص لتطبيقك بدلاً من استخدام Apache، نظرًا لأن أي تطبيق آخر تقوم بإنشائه سيتم تشغيله كـ Apache افتراضيًا، ويمكن أن يحصل على وصول غير مصرح به إلى قاعدة بياناتك.

ما عليك سوى البحث عن "GRANT" في الوثائق @ dev.mysql.com للحصول على مزيد من المعلومات.إذا كانت لديك أسئلة أكثر تحديدًا فيما يتعلق بقاعدة البيانات، فما عليك سوى تعديل سؤالك، وسوف ألقي نظرة عليه.

هل يقوم البرنامج النصي Connect.php بإجراء الاتصال بالفعل أم أنه يحدد فقط وظيفة تحتاج إلى الاتصال بها لإنشاء اتصال؟يشير الخطأ الذي تحصل عليه إلى عدم وجود اتصال تم إنشاؤه مسبقًا على الإطلاق.

الوقت المتوقع للوصول:قم أيضًا بتغيير التضمين إلى طلب.أظن أنه لا يتضمن الملف على الإطلاق.لكن التضمين يمكن أن يفشل بصمت.

المتأنق الجواب هو DUH كبير!والذي للأسف استغرق مني بعض الوقت لمعرفة ذلك أيضًا.من المحتمل أن يكون لديك وظيفة مثل dbconnect() وأنك تستخدم متغيرات من ملف التضمين لإجراء الاتصال.$conn = mysql_connect($dbhost، $dbuser، $dbpass).

حسنًا، بما أن هذا موجود داخل دالة، فيجب تمرير المتغيرات من ملف التضمين إلى الوظيفة وإلا فلن تعرف الوظيفة ما هو $dbhost و$dbuser و$dbpass.تتمثل إحدى طرق إصلاح ذلك في جعل هذه المتغيرات عامة حتى تتمكن وظائفك من التقاطها.الحل الآخر الذي ليس آمنًا للغاية هو كتابة المضيف والمستخدم وتمرير وظيفة mysql_connect.

آمل أن يساعد هذا ولكن كان لي نفس المشكلة.

إذا كنت قادرًا بالفعل على الإدراج باستخدام نفس مكالمات الاتصال، فمن المرجح أن تكمن مشكلتك في عدم حصول المستخدم "Apache" على أذونات SELECT في قاعدة البيانات.إذا قمت بتثبيت phpMyAdmin، فيمكنك الاطلاع على أذونات المستخدم في جزء الامتيازات.كما يجعل phpMyAdmin من السهل جدًا تعديل الأذونات.

إذا كان لديك حق الوصول إلى سطر الأوامر فقط، فيمكنك التحقق من الأذونات من قاعدة بيانات MySQL.

ربما ستحتاج إلى القيام بشيء مثل:

منح التحديد على myDatabase.myTable إلى 'Apache'@'localhost'؛

هل تذكرت أن تفعل:

flush privileges;

إذا لم يتم إعداد المستخدم، فسيعطي الخطأ "Apache"@"localhost".

فقط للتحقق، إذا كنت تستخدم فقط هذا الجزء تحصل على خطأ؟

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

$query = "SELECT * from story";
$result = mysql_query($query) or die(mysql_error());

إذا كان الأمر كذلك، فهل لا يزال يظهر لك خطأ إذا قمت بنسخ ولصق أحد هذه الإدخالات في هذه الصفحة، فأنا أحاول معرفة ما إذا كان محليًا للصفحة أو هذا السطر الفعلي.

أيضًا، هل يمكنك نشر نسخة من مكالمات الاتصال (مطروحًا منها كلمات المرور)، ما لم تستخدم الإدخالات نفس بناء الجملة تمامًا مثل هذا المثال.

فقط للتحقق، إذا كنت تستخدم هذا الجزء فقط فستحصل على خطأ؟

إذا كان الأمر كذلك، فهل لا يزال يظهر لك خطأ إذا قمت بنسخ ولصق إحدى هذه الإدخالات في هذه >الصفحة، فأنا أحاول معرفة ما إذا كانت محلية بالصفحة أو ذلك السطر الفعلي.

أيضًا، هل يمكنك نشر نسخة من مكالمات الاتصال (مطروحًا منها كلمات المرور)، ما لم تستخدم الإدخالات > نفس بناء الجملة تمامًا كما في هذا المثال.

إليك ما هو موجود في ملف Connection.php.لقد قمت بالربط بالملف من خلال التضمين بنفس الطريقة التي أقوم بها بتنفيذ استعلامات INSERT في مكان آخر من الكود.

$conn = mysql_connect("localhost", ******, ******) or die("Could not connect");
mysql_select_db("adbay_com_-_cms") or die("Could not select database");

سأحاول استخدام استعلام INSERT العامل في هذه المنطقة للتحقق من ذلك.

أما بالنسبة للآخرين الذين ينشرون حول الوصول إلى كلمة المرور.لقد قمت، كما هو مذكور في مشاركتي الأولى، بالتحقق من الأذونات.لقد استخدمت phpMyAdmin للتحقق من صحة أذونات حساب المستخدم الذي كنت أستخدمه.وإذا كان الأمر مهمًا على الإطلاق، فإن apache@localhost ليس اسم حساب المستخدم الذي أستخدمه للدخول إلى قاعدة البيانات.ليس لدي أي حسابات مستخدمين تحمل اسم apache على الإطلاق في هذا الشأن.

يمكنك القيام بأحد الإجراءات التالية:

  • أضف المستخدم "Apache" وقم بإعداد امتيازاته من phpmyadmin أو باستخدام mysql على Shell
  • أخبر php بالتشغيل mysql_connect كمستخدم آخر، شخص لديه بالفعل الامتيازات المطلوبة (ولكن ربما ليس الجذر)، ابحث عن mysql.default_user في ملف php.ini الخاص بك.

هل يحتاج مستخدم Apache إلى كلمة مرور للاتصال بقاعدة البيانات؟إذا كان الأمر كذلك، فحقيقة أنه يقول "باستخدام كلمة المرور:NO" سيقودني إلى الاعتقاد بأن الرمز يحاول الاتصال بدون كلمة مرور.

ومع ذلك، إذا كان مستخدم Apache لا يحتاج إلى كلمة مرور، فقد يكون التحقق مرة أخرى من الأذونات فكرة جيدة (والذي ذكرت أنك قمت بالتحقق منه بالفعل).قد يكون من المفيد محاولة تنفيذ شيء مثل هذا في موجه MySQL:

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

ينبغي أن يكون بناء الجملة هذا صحيحا.

بخلاف ذلك، أنا في حيرة من أمري مثلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top