PDO错误:无法初始化字符集utf8_general_ci

时间:2017-04-12 04:42:44

标签: php mysql pdo

我的网络主机上的PHP最近更新了,现在我的旧MySQL查询显示“已弃用”错误消息。我需要将mysql_query代码转换为PDO。这就是我的开始:

<?

    $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 {} ?>

<?  } ?>

我对此完全陌生,不知道从哪里开始。我还注意到,今天它现在也说“没有选择数据库”。

我一直试图在PDO中逐行重写这个,到目前为止我得到了:

  

致命错误:带有消息'SQLSTATE [HY000] [2019]的未捕获异常'PDOException'无法在/ my_file_location / test-this中初始化字符集utf8_general_ci(path:/ usr / share / mysql / charsets /)'。 php:21堆栈跟踪:#0 /my_file_location/test-this.php(21):PDO-&gt; __ construct('mysql:host = localhost','username','password')#1 {main}抛出/第21行的my_file_location / test-this.php

我在上面的错误中引用的第21行如下:

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

我现在将utf8_general_ci更改为utf8,现在有以下消息:

  

致命错误:带有消息的未捕获异常'PDOException'   'SQLSTATE [42000] [1044]访问被拒绝用户'用户名'@'localhost'   到/my_file_location/test-this.php:21中的数据库'database_name''   堆栈跟踪:#0 /my_file_location/test-this.php(21):   PDO-&gt; __ construct('mysql:host = localhost','username','password')#1   {main}在第21行的/my_file_location/test-this.php中抛出

我认为我的网络主机使用的是Windows操作系统,而刚刚升级到的PHP版本是5.6.30,但我不知道mySQL数据库。

更新:好的,经过几天的阅读和探索,我已经设法进行了重写工作。我现在有以下工作:

<?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 {}

    }

?>

现在我希望我能想出如何将结果限制为仅满足条件的前三行。到目前为止,我已尝试了几件事,但还没有成功。我想它会回到阅读和测试,直到找到有用的东西。

3 个答案:

答案 0 :(得分:0)

错误消息很明确:没有这样的字符集。从来没有。

utf8_general_ci是排序规则,而正确的字符集名称只是utf8

让我向您推荐我的PDO tutorial,它可以帮助您避免像这样的许多混淆。

答案 1 :(得分:0)

更新:好的,经过几天的阅读和探索,我已经设法进行了重写工作。我现在有以下工作:

<?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 {}

    }

?>

现在我希望我能想出如何将结果限制为仅满足条件的前三行。到目前为止,我已经尝试过几件事,但还没有成功。我想它会回到阅读和测试,直到找到有用的东西。

答案 2 :(得分:-1)

正确的立即解决方案是禁止在您的实际网站上显示错误。无论如何都应该这样做,因为你从不想要向用户公开这些信息:

ini_set('display_errors', false);

不要在非实时(测试)网站上执行此操作,因为您希望在那里看到错误。

在当前站点上放置此功能后,从旧的数据库扩展迁移的任务将不那么紧急。我的猜测是你现在使用的是PHP 5.6,它仍支持mysql_函数,但你仍然需要准备7.x,它们已被删除。