2017-09-10 1 views
-1

je suis en train de faire un CMS de base, suivant le tutoriel ici: Cms Tutmysqli vs msql et connexion AOP

En Article.php, il utilise le mysql_escape_string (ordre de $) avec une connexion PDO, qui est maintenant supprimé à partir de PHP 7, j'ai changé pour mysqli_escape_string ($ order) et continue en quelque sorte mais donne les erreurs avec les 2 paramètres. Je suis nouveau sur php, mais comme je l'ai cherché, je pense que le problème est avec la connexion PDO, je ne peux pas mettre la connexion comme deuxième argument. Des pensées et des idées? Merci d'avance.

Voici le code:

public static function getList($numRows=1000000, $order="publicationDate DESC") { 
    $conn = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 
    $sql = "SELECT SQL_CALC_FOUND_ROWS *, UNIX_TIMESTAMP(publicationDate) AS publicationDate FROM articles 
      ORDER BY " . mysqli_escape_string($order) . " LIMIT :numRows"; 

    $st = $conn->prepare($sql); 
    $st->bindValue(":numRows", $numRows, PDO::PARAM_INT); 
    $st->execute(); 
    $list = array(); 

    while ($row = $st->fetch()) { 
    $article = new Article($row); 
    $list[] = $article; 
    } 

    // Now get the total number of articles that matched the criteria 
    $sql = "SELECT FOUND_ROWS() AS totalRows"; 
    $totalRows = $conn->query($sql)->fetch(); 
    $conn = null; 
    return (array ("results" => $list, "totalRows" => $totalRows[0])); 
} 

Après la mise à jour du code, avec la création d'une connexion mysqli, dans le navigateur il y a, cette erreur: mysqli_connect(): (HY000/2002): php_network_getaddresses: getaddrinfo a échoué: Aucun tel hôte n'est connu.

et dans le journal d'erreur de serveur également ceci: Appel à une fonction membre real_escape_string() sur booléenne

Le code de mise à jour est:

public static function getList($numRows=1000000, $order="publicationDate DESC") { 
    $conn = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 
    $link = mysqli_connect(DB_USERNAME, DB_PASSWORD, DB_DSN); 

    $sql = "SELECT SQL_CALC_FOUND_ROWS *, UNIX_TIMESTAMP(publicationDate) AS publicationDate FROM articles 
      ORDER BY " . $link->real_escape_string($order) . " LIMIT :numRows"; 

    $st = $conn->prepare($sql); 
    $st->bindValue(":numRows", $numRows, PDO::PARAM_INT); 
    $st->execute(); 
    $list = array(); 

    while ($row = $st->fetch()) { 
    $article = new Article($row); 
    $list[] = $article; 
    } 

    // Now get the total number of articles that matched the criteria 
    $sql = "SELECT FOUND_ROWS() AS totalRows"; 
    $totalRows = $conn->query($sql)->fetch(); 
    $conn = null; 
    return (array ("results" => $list, "totalRows" => $totalRows[0])); 
} 
+0

Vous dites que vous obtenez des erreurs, mais pas quelles sont les erreurs, ni de confirmer exactement quelle instruction est erronée. C'est à peu près l'information la plus importante concernant votre problème: -/ –

+0

Les erreurs concernent la sqli_real_escape_string(), et concernent les 2 paramètres à prendre. –

+0

Ne pas * décrire * l'erreur. Mettez à jour votre question et incluez le texte exact. Pas une paraphrase de celui-ci. Le texte exact –

Répondre

0

Vous devez choisir un de mysql_, mysqli_ et PDO (ne sélectionnez pas mysql_).

Vous ne pouvez pas mélanger PDO et mysqli_.

Vous n'avez pas besoin d'utiliser mysqli_escape_string pour défendre PDO contre l'injection SQL; il a ses propres méthodes (que vous utilisez déjà pour nubRows !!). Voir How can I prevent SQL injection in PHP? pour savoir comment gérer les caractères spéciaux avec PDO.

+0

Pouvez-vous utiliser des paramètres pour des parties de l'instruction SQL elle-même? Je soupçonne ... non? (re votre commentaire sur l'utilisation de params pour 'numRows' étant pertinent pour une tactique pour échapper à l'autre bit aussi). –