
Παίρνω το ακόλουθο μήνυμα λάθους:



> 
> Δεν επιτρέπεται η πρόσβαση για το χρήστη 'apache' @ 'localhost' (με τον κωδικό: NO)
> 
> 
> 


Όταν χρησιμοποιείτε τον ακόλουθο κώδικα:



```
<?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 μου συνδέσετε τις κλήσεις που έχουν λεπτή εργασία με μου `INSERT IGNORE` ερωτήματα σε άλλο τμήμα του λογισμικού. Αν έχω σχολιάσει τη `$result = mysql_query`γραμμή, τότε θα περνά από τη δήλωση άλλο. Έτσι, είναι ότι η γραμμή ή το περιεχόμενο του αν.


Έχω ψάξει στο διαδίκτυο για τυχόν λύσεις, και οι περισσότεροι φαίνεται να σχετίζεται με πάρα πολλές συνδέσεις δεδομένων MySQL ή ότι ο χρήστης είμαι συνδεθείτε στο MySQL καθώς δεν έχει άδεια. Έχω ελέγξει και τα δύο. Μπορώ ακόμα να εκτελέσετε άλλες απορίες μου σε άλλα σημεία του λογισμικού, και έχω διαπιστώσει ότι ο λογαριασμός έχει τα κατάλληλα δικαιώματα.

 
MySQL / Apache Σφάλμα στο ερώτημα PHP MySQL
===========================================




> 
> Και αν έχει σημασία καθόλου, apache @ localhost δεν είναι το όνομα του λογαριασμού χρήστη που χρησιμοποιώ για να πάρει στη βάση δεδομένων. Δεν έχω κανένα λογαριασμό χρήστη με το όνομα apache σε αυτούς καθόλου για το θέμα αυτό.
> 
> 
> 


Αν λέει «apache @ localhost» το όνομα δεν έχει πάρει περάσει σωστά στη σύνδεση MySQL. «Apache» είναι συνήθως ο χρήστης που εκτελεί τη διαδικασία httpd (τουλάχιστον στα συστήματα Redhat-based) και αν δεν το ψευδώνυμο περνά κατά τη διάρκεια της σύνδεσης MySQL χρησιμοποιεί όποιον ζητά τη σύνδεση.


Αν κάνετε τη σωστή σύνδεση στο σενάριό σας, όχι σε ένα που ονομάζεται αρχείο, μπορείτε να πάρετε το ίδιο λάθος;

 

Ακριβώς για να ελέγξετε, αν χρησιμοποιείτε **μόνο** αυτό το μέρος μπορείτε να πάρετε ένα λάθος;



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

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

```

Αν ναι, μπορείτε να πάρετε ακόμα ένα σφάλμα αν αντιγράψετε και να επικολλήσετε ένα από αυτά τα Εισάγει σε αυτή τη σελίδα, προσπαθώ να δω αν είναι τοπική στη σελίδα ή το εν λόγω πραγματική γραμμή.


Επίσης, μπορείτε να στείλετε ένα αντίγραφο των κλήσεων σύνδεσης (μείον τους κωδικούς πρόσβασης), εκτός αν τα ένθετα χρησιμοποιούν ακριβώς την ίδια σύνταξη όπως αυτό το παράδειγμα.

 

Μήπως ο χρήστης apache απαιτεί έναν κωδικό πρόσβασης για να συνδεθείτε με τη βάση δεδομένων; Αν ναι, τότε το γεγονός ότι λέει «με τον κωδικό: NO» θα με οδηγούσε στο συμπέρασμα ότι ο κώδικας προσπαθεί να συνδεθεί χωρίς κωδικό πρόσβασης.


Αν, όμως, ο χρήστης apache δεν απαιτεί κωδικό πρόσβασης, ένα διπλό έλεγχο των αδειών μπορεί να είναι μια καλή ιδέα (το οποίο μπορείτε αναφέρατε ήδη ελεγχθεί). Μπορεί ακόμα να είναι επωφελής για να δοκιμάσετε την εκτέλεση κάτι τέτοιο σε μια γραμμή MySQL:



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

```

Αυτό σύνταξη θα πρέπει να είναι σωστή. 


Εκτός από αυτό, είμαι εξίσου μείνει άναυδοι όπως είστε.

 

Αν μάλιστα είστε σε θέση να τοποθετήσετε χρησιμοποιώντας τις ίδιες κλήσεις σύνδεσης, το πρόβλημα πιθανότατα βρίσκεται στο χρήστη «apache» δεν έχουν SELECT δικαιώματα στη βάση δεδομένων. Αν έχετε phpMyAdmin εγκατεστημένο μπορείτε να δείτε τα δικαιώματα για το χρήστη στο παράθυρο προνόμια. phpMyAdmin καθιστά πολύ εύκολο να τροποποιήσετε τα δικαιώματα.


Εάν έχετε πρόσβαση στη γραμμή εντολών μόνο, μπορείτε να ελέγξετε τα δικαιώματα από τη βάση δεδομένων MySQL.


Μάλλον θα πρέπει να κάνετε κάτι σαν: 


GRANT ΕΠΙΛΟΓΗ ΓΙΑ myDatabase.myTable ΝΑ 'apache' @ 'localhost'?

 


> 
> Ακριβώς για να ελέγξετε, αν χρησιμοποιείτε μόνο αυτό το μέρος μπορείτε να πάρετε ένα λάθος;
> 
> 
> Αν ναι, μπορείτε να πάρετε ακόμα ένα σφάλμα αν αντιγράψετε και να επικολλήσετε ένα από αυτά τα Εισάγει σε αυτό> σελίδα, προσπαθώ να δω αν είναι τοπική στη σελίδα ή το εν λόγω πραγματική γραμμή.
> 
> 
> Επίσης, μπορείτε να στείλετε ένα αντίγραφο των κλήσεων σύνδεσης (μείον τους κωδικούς πρόσβασης), εκτός αν τα ένθετα> χρησιμοποιούν ακριβώς την ίδια σύνταξη όπως αυτό το παράδειγμα.
> 
> 
> 


Εδώ είναι αυτό που βρίσκεται στο αρχείο connection.php. Θα συνδέεται με το αρχείο μέσα από μια συμπεριλάβει με τον ίδιο τρόπο όπως όταν εκτελώ το ένθετο αγνόησης ερωτήματα σε άλλα σημεία του κώδικα.



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

```

Θα προσπαθήσουμε το ένθετο εργασίας αγνόησης ερώτημα σε αυτόν τον τομέα για να ελέγξετε ότι έξω.


Όσον αφορά τους άλλους απόσπαση για τη χρήση κωδικού πρόσβασης. Το έκανα, όπως αναφέρεται στην πρώτη μου ανάρτηση, ελέγξτε τα δικαιώματα. Θα χρησιμοποιηθεί phpMyAdmin για να βεβαιωθείτε ότι τα δικαιώματα για το λογαριασμό χρήστη που χρησιμοποιούσα ήταν σωστές. Και αν έχει σημασία καθόλου, apache @ localhost δεν είναι το όνομα του λογαριασμού χρήστη που χρησιμοποιώ για να πάρει στη βάση δεδομένων. Δεν έχω κανένα λογαριασμό χρήστη με το όνομα apache σε αυτούς καθόλου για το θέμα αυτό.

 

Μην ξεχάσετε να ελέγξετε τα αρχεία καταγραφής σφαλμάτων της βάσης δεδομένων σας. Θα πρέπει να μπορείτε να δείτε εάν είστε ακόμα χτύπημα του DB. Εάν δεν είναι, θα πρέπει να ελέγξετε τους κανόνες του τείχους προστασίας σας στο κουτί. Σε ένα κουτί linux μπορείτε να εκτελέσετε iptables -L να πάρει τους κανόνες λίστα του τείχους προστασίας.


Διαφορετικά, θα είναι μια καθαρά θέμα της πρόσβασης. Κάντε μια «επιλέξτε * από mysql.user» για να δείτε αν ο χρήστης apache έχει ακόμη συσταθεί εκεί. Επιπλέον, θα ήθελα να συστήσω τη δημιουργία ενός λογαριασμού ειδικά για την εφαρμογή σας, σε αντίθεση με τη χρήση apache, δεδομένου ότι οποιαδήποτε άλλη εφαρμογή που δημιουργείτε θα τρέξει όπως apache από προεπιλογή, και θα μπορούσε να πάρει τη μη εξουσιοδοτημένη πρόσβαση σε db σας.


Απλά κοιτάζω προς τα πάνω «GRANT» στην τεκμηρίωση @ dev.mysql.com για να πάρετε περισσότερες πληροφορίες. Εάν έχετε περισσότερες συγκεκριμένες questiosn σχετικά db, απλά επεξεργαστείτε την ερώτησή σας, και εγώ θα ρίξω μια ματιά.

 

Μήπως το σενάριο connect.php κάνει πραγματικά τη σύνδεση ή μήπως απλά ορίζουν μια λειτουργία θα πρέπει να καλέσετε για να δημιουργήσετε μια σύνδεση; Το σφάλμα που παίρνετε είναι σύμπτωμα που δεν έχει προηγουμένως συσταθεί σύνδεση σε όλα.


ETA: Επίσης να αλλάξει το συμπεριλάβει σε ένα απαιτούν. Υποψιάζομαι ότι δεν είναι συμπεριλαμβανομένου στην πραγματικότητα το αρχείο σε όλα. Αλλά περιλαμβάνουν μπορεί να αποτύχει σιωπηλά.

 

Αλλάξτε το include () να απαιτούν (). **Εάν το αρχείο «connect.php» δεν μπορεί να απαιτήσει () d, το σενάριο θα αποτύχει** με ένα μοιραίο λάθος, ενώ **περιλαμβάνουν () δημιουργεί μόνο μια προειδοποίηση** . Εάν το όνομα χρήστη που περνάτε να mysql\_connect () δεν είναι «apache», μια λανθασμένη πορεία προς την σύνδεση σενάριο είναι ο πιο συνηθισμένος τρόπος για να πάρει αυτό το είδος του λάθους.

 

Φίλε η απάντηση είναι ένα μεγάλο DUH! η οποία, δυστυχώς, μου πήρε λίγο χρόνο για να καταλάβω επίσης. Πιθανόν να έχετε μια συνάρτηση όπως dbconnect () και χρησιμοποιείτε μεταβλητές από ένα αρχείο περιλαμβάνει να κάνει τη σύνδεση. $ Conn = mysql\_connect ($ dbhost, $ dbuser, $ dbpass).


Λοιπόν αφού αυτό είναι μέσα σε μια συνάρτηση των μεταβλητών από το αρχείο περιλαμβάνει πρέπει να περάσει στη λειτουργία ή αλλιώς η λειτουργία δεν θα ξέρουν τι $ dbhost, $ dbuser και $ dbpass είναι. Ένας τρόπος για να διορθωθεί αυτό είναι να κάνουν αυτές τις μεταβλητές παγκόσμια έτσι ώστε οι λειτουργίες σας μπορεί να τους πάρει. Μια άλλη λύση που δεν είναι πολύ ασφαλές θα ήταν να γράψετε εσείς υποδοχής, χρήστη και να περάσει στη λειτουργία mysql\_connect.


Η ελπίδα αυτό βοηθά, αλλά είχα το ίδιο πρόβλημα.

 

Μπορείτε να κάνετε ένα από τα εξής:


* Προσθέστε το χρήστη «apache» και ρύθμιση των προνομίων της από phpmyadmin ή χρησιμοποιώντας MySQL σε ένα κέλυφος
* Πείτε php να τρέξει `mysql_connect`ως άλλος χρήστης, κάποιος που έχει ήδη χρειάζονται τα προνόμια (αλλά ίσως όχι root), αναζητήστε mysql.default\_user στο αρχείο php.ini σας.

 

Μήπως θυμάστε να κάνετε:



```
flush privileges;

```

Εάν ο χρήστης δεν έχει ρυθμιστεί, τότε θα δώσει το «apache» @ «localhost» σφάλμα.

 