2017-04-12 3 views
-4

PHP auf meinem Webhost wurde vor kurzem aktualisiert und jetzt zeigen meine alten MySQL-Abfragen die "veraltete" Fehlermeldung an. Ich muss mysql_query-Code in PDO konvertieren. Hier ist, was ich beginne mit:PDO-Fehler: Zeichensatz kann nicht initialisiert werden utf8_general_ci

<? 

    $con = mysql_connect("localhost", "username", "password"); 
    if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("database_name", $con); 

     $result = mysql_query("select * from event_calendar where event_year >= '2017' order by event_datenumber asc") 
     or die(mysql_error()); 

    while($row = mysql_fetch_array($result)) { 

       $event_date = $row['event_date']; 
       $event_month = $row['event_month']; 
       $event_monthname = $row['event_monthname']; 
       $event_year = $row['event_year']; 
       $event_datenumber = $row['event_datenumber']; 
       $event_starttime = $row['event_starttime']; 
       $event_location = $row['event_location']; 
       $event_city = $row['event_city']; 
       $event_state = $row['event_state']; 
       $event_directions = $row['event_directions']; 

    $testmonth = date("F"); 
    $testmonth2 = date("m"); 
    $testdate = date("d"); 
    $testyear = date("Y"); 
    $testdatenumber = $testyear.$testmonth2.$testdate; 

    ?> 

    <? 

    if ($testdatenumber <= $event_datenumber){ 

    ?> 

    <p> 
    <b><? echo $event_monthname.' '.$event_date ?></b> - <? echo $event_starttime ?><br> 
    <? echo $event_location ?><br> 
    <? echo $event_city ?>, <? echo $event_state ?><br> 
    <a href="<? echo $event_directions ?>" target="_blank"><b>Directions</b></a> 
    </p> 

    <? } else {} ?> 

<? } ?> 

Ich bin völlig neu und weiß nicht, wo ich anfangen soll. Mir ist auch aufgefallen, dass heute auch "Keine Datenbank ausgewählt" steht.

Ich habe atempting diese Zeile selbst in PDO Linie neu zu schreiben, und so weit ich bin immer:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2019] Can't initialize character set utf8_general_ci (path: /usr/share/mysql/charsets/)' in /my_file_location/test-this.php:21 Stack trace: #0 /my_file_location/test-this.php(21): PDO->__construct('mysql:host=localhost', 'username', 'password') #1 {main} thrown in /my_file_location/test-this.php on line 21

Meine Linie 21, oben in dem Fehler Bezug genommen wird, ist wie folgt:

$db = new PDO('mysql:host=localhost;dbname=database_name;charset=utf8_‌​general_ci', 'username', 'password'); 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000] [1044] Access denied for user 'username'@'localhost' to database 'database_name'' in /my_file_location/test-this.php:21 Stack trace: #0 /my_file_location/test-this.php(21): PDO->__construct('mysql:host=localhost', 'username', 'password') #1 {main} thrown in /my_file_location/test-this.php on line 21

M: nur UTF-8 und haben nun die folgende Meldung

ich habe utf8_general_ci jetzt geändert Ich glaube, dass der Webhost ein Windows-Betriebssystem verwendet und die PHP-Version, auf die er gerade aktualisiert wurde, ist 5.6.30, aber ich habe keine Ahnung von der mySQL-Datenbank.

UPDATE: OK, nach ein paar Tagen lesen und stochern, habe ich es geschafft, eine funktionierende Neufassung zu erstellen. Ich habe jetzt die folgenden Arbeiten:

<?php 
    $db = new PDO('mysql:host=localhost;dbname=database_name;charset=utf8mb4', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, 
                           PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 

    foreach($db->query('SELECT * FROM event_calendar WHERE event_year >= 2017 ORDER BY event_datenumber ASC') as $row) { 

    $testmonth = date("F"); 
    $testmonth2 = date("m"); 
    $testdate = date("d"); 
    $testyear = date("Y"); 
    $testdatenumber = $testyear.$testmonth2.$testdate; 

if ($testdatenumber <= $row['event_datenumber']) { 

    echo "<p>"; 
    echo "<u><h4>".$row['event_monthname']." ".$row['event_date'].", ".$row['event_year']."</h4></u>"; 
    echo "<b>What:</b> ".$row['event_title']."<br/>"; 
    echo "<b>Where:</b> ".$row['event_location']." - ".$row['event_address1'].", ".$row['event_city'].", ".$row['event_state']." ".$row['event_zip']."<br/>"; 
    echo "<b>When:</b> ".$row['event_starttime']."<br/>"; 
    echo "<b>When:</b> <a href='".$row['event_directions']."' target='_blank'><b>Click here</b></a>"; 
    echo "</p>"; 

    } else {} 

    } 

?> 

Jetzt nur ich wünsche, ich könnte herausfinden, wie die Ergebnisse zu begrenzen, um nur die ersten drei Zeilen, die die Kriterien erfüllen. Ich habe bisher mehrere Dinge ausprobiert, war aber noch nicht erfolgreich. Ich denke, es ist wieder zu lesen und zu testen, bis ich etwas finde, das funktioniert.

+3

ist der Weg zu beginnen Tutorials im Internet über gU zu lesen, müssen Sie Dump hier nicht nur den alten Code auf Stackoverflow und erwarten, dass jemand es nur gerade nach oben für Sie konvertieren, wie geht es dir gU lernen gehen, wenn Sie werden es nicht selbst starten, Sie sind eindeutig auf dem falschen Platz – Ghost

+3

Dieser Link [Migration von MySQL-Erweiterung zum PDO] (https://www.sitepoint.com/migrate-from-the-mysql-extension-to-pdo /) vielleicht helfen Sie –

+0

Danke, Yu Jiaao, für mindestens so nett zu sein, einen Link für Informationen anzubieten. Sehr geschätzt. – Blackhatter1

Antwort

0

UPDATE: OK, nach ein paar Tagen lesen und stochern, habe ich es geschafft, eine funktionierende Neufassung zu erstellen. Ich habe jetzt die folgenden Arbeiten:

<?php 
    $db = new PDO('mysql:host=localhost;dbname=database_name;charset=utf8mb4', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, 
                           PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 

    foreach($db->query('SELECT * FROM event_calendar WHERE event_year >= 2017 ORDER BY event_datenumber ASC') as $row) { 

    $testmonth = date("F"); 
    $testmonth2 = date("m"); 
    $testdate = date("d"); 
    $testyear = date("Y"); 
    $testdatenumber = $testyear.$testmonth2.$testdate; 

if ($testdatenumber <= $row['event_datenumber']) { 

    echo "<p>"; 
    echo "<u><h4>".$row['event_monthname']." ".$row['event_date'].", ".$row['event_year']."</h4></u>"; 
    echo "<b>What:</b> ".$row['event_title']."<br/>"; 
    echo "<b>Where:</b> ".$row['event_location']." - ".$row['event_address1'].", ".$row['event_city'].", ".$row['event_state']." ".$row['event_zip']."<br/>"; 
    echo "<b>When:</b> ".$row['event_starttime']."<br/>"; 
    echo "<b>When:</b> <a href='".$row['event_directions']."' target='_blank'><b>Click here</b></a>"; 
    echo "</p>"; 

    } else {} 

    } 

?> 

Jetzt nur ich wünsche, ich könnte herausfinden, wie die Ergebnisse zu begrenzen, um nur die ersten drei Zeilen, die die Kriterien erfüllen.Ich habe bisher mehrere Dinge ausprobiert, war aber noch nicht erfolgreich. Ich denke, es ist wieder zu lesen und zu testen, bis ich etwas finde, das funktioniert.

-1

Die richtige sofortige Lösung ist die Anzeige von Fehlern auf Ihrer Live-Site zu deaktivieren. Dies sollte auf jeden Fall durchgeführt werden, da Sie nie diese Informationen für die Nutzer verfügbar machen möchten:

ini_set('display_errors', false); 

Tun Sie dies nicht auf Nicht-Live (Test) Websites, wie Sie wollen es Fehler sehen.

Sobald Sie dies auf Ihrer aktuellen Site installiert haben, ist Ihre Aufgabe, von dieser alten Datenbankerweiterung wegzuwandern, weniger dringend. Meine Vermutung ist, dass Sie jetzt auf PHP 5.6 sind, das die Funktionen mysql_ unterstützt, aber Sie müssen sich immer noch auf 7.x vorbereiten, wo sie entfernt wurden.

+0

Danke für die Info. Ja, es scheint PHP 5.6.30 – Blackhatter1

0

Die Fehlermeldung ist klar: Es gibt keinen solchen Zeichensatz. Und bin es nie gewesen.

utf8_general_ci ist eine Zusammenstellung, während die richtige charset Namen mir gerade utf8

ist Lassen Sie empfehlen Sie meine PDO tutorial die Ihnen helfen, eine Menge Verwirrungen wie dies zu vermeiden.

+0

Danke zu sein. Ich habe die Änderung an utf8 vorgenommen und erhalte jetzt eine Meldung über den Zugriff verweigert. Ich werde dein Tutorial überprüfen. Danke für den Link. – Blackhatter1

Verwandte Themen