Php PDO错误:Can';t初始化字符集utf8\u常规\u ci

Php PDO错误:Can';t初始化字符集utf8\u常规\u ci,php,mysql,pdo,Php,Mysql,Pdo,我的web主机上的PHP最近进行了更新,现在我的旧MySQL查询显示了“弃用”错误消息。我需要将mysql_查询代码转换为PDO。以下是我的开始: <? $con = mysql_connect("localhost", "username", "password"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("database_name", $con);

我的web主机上的PHP最近进行了更新,现在我的旧MySQL查询显示了“弃用”错误消息。我需要将mysql_查询代码转换为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 {} ?>

<?  } ?>
我现在已将utf8\u general\u ci更改为仅utf8,现在有以下消息:

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

我相信我的web主机使用的是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 {}

    }

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

    }

?>

现在我只希望我能弄清楚如何将结果限制在满足条件的前三行。到目前为止,我已经尝试了几件事,但还没有成功。我想,在我找到有效的方法之前,应该重新开始阅读和测试。

正确的即时解决方案是禁用实时站点上的错误显示。无论如何都应该这样做,因为您永远不想向用户公开该信息:

ini_set('display_errors', false);
不要在非活动(测试)站点上执行此操作,因为您希望在那里看到错误


一旦您在当前站点上安装了此功能,从旧数据库扩展迁移出去的任务就不再那么紧迫了。我猜您现在使用的是PHP5.6,它仍然支持
mysql\uUcode>函数,但是您仍然需要准备7.x,因为它们已经被删除了。

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

utf8\u general\u ci
是一个排序规则,而正确的字符集名称只是
utf8


让我向您推荐我的,这将帮助您避免许多类似的混乱。

更新:好的,经过几天的阅读和摸索,我终于想出了一个可行的重写方法。我现在有以下工作:

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

    }

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

    }

?>


现在我只希望我能弄清楚如何将结果限制在满足条件的前三行。到目前为止,我已经尝试了几件事,但还没有成功。我想在我找到有用的东西之前,我会重新开始阅读和测试。

开始的方法是在互联网上阅读关于pdo的教程,你不能把你的旧代码扔到stackoverflow上,期望有人直接为你转换,如果你自己不启动pdo,你将如何学习它,很明显,你在错误的地方。这个链接可能会帮助你感谢你,于佳奥,至少你很友好,提供了一个信息链接。非常感谢。太好了,你能用代码格式在最后的问题中添加这一点吗?这是一个更加集中的问题。我没有遇到那个错误。值得一提的是你的操作系统和版本。(如果这个问题关闭,基于当前版本,在编辑之后,ping Me,我会考虑重新打开投票)。谢谢你的信息。是的,看起来是PHP5.6.30谢谢。我更改为utf8,现在收到一条拒绝访问的消息。我会看看你的教程。谢谢你的链接。