2017-09-10 1 views
-1

i eine grundlegende cms zu machen versuchen, nach dem Tutorial hier: Cms TutMysqli vs msql und PDO Verbindung

In Article.php, er nutzt die mysql_escape_string ($ Reihenfolge) mit einer PDO-Verbindung, die jetzt entfernt Von PHP 7 wechselte ich zu mysqli_escape_string ($ order) und proceedes irgendwie aber gibt die Fehler mit den 2 Parametern. Ich bin neu zu PHP, aber als ich suchte, denke ich, dass das Problem mit der PDO-Verbindung ist, kann ich nicht die Verbindung als zweites Argument setzen. Irgendwelche Gedanken und Ideen? Danke im Voraus.

Hier ist der 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])); 
} 

Nach dem Code zu aktualisieren, mit einer Mysqli Verbindung zu schaffen, in Browser gibt es, diese Fehler: mysqli_connect(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Ein solcher Host ist nicht bekannt.

und in Log-Server-Fehler auch dies: auf eine Elementfunktion real_escape_string Anruf() auf boolean

Der Update-Code ist:

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

Sie sagen, Sie erhalten Fehler, aber nicht, was die Fehler sind, noch bestätigen Sie genau, welche Aussage fehlerhaft ist. Das sind so ziemlich die wichtigsten Informationen zu Ihrem Problem: -/ –

+0

Der Fehler ist über die sqli_real_escape_string(), und ist über die 2 Parameter, die zu nehmen ist. –

+0

* Beschreibe * den Fehler nicht. Aktualisieren Sie Ihre Frage und fügen Sie den genauen Text hinzu. Keine Umschreibung davon. Der genaue Text. –

Antwort

0

Sie benötigen ein von mysql_, mysqli_ zu holen und PDO (wählen Sie nicht mysql_).

Sie können PDO und mysqli_ nicht mischen.

Sie müssen mysqli_escape_string nicht verwenden, um PDO gegen SQL-Injektion zu verteidigen; Es hat seine eigenen Methoden (die Sie bereits für nubRows verwenden !!).

Hinweise zur Handhabung von Sonderzeichen mit PDO finden Sie unter How can I prevent SQL injection in PHP?.

+0

Können Sie Parameter für Teile der SQL-Anweisung selbst verwenden? Ich vermute ... nein? (Ihr Kommentar über die Verwendung von Parametern für 'numRows' ist relevant für eine Taktik, um auch das andere Bit zu umgehen). –