【问题标题】:PDO error: Can't initialize character set utf8_general_ciPDO 错误:无法初始化字符集 utf8_general_ci
【发布时间】:2017-09-07 16:45:28
【问题描述】:

我的 web 主机上的 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 中逐行重写,到目前为止我得到了:

致命错误:未捕获的异常“PDOException”与消息“SQLSTATE[HY000] [2019] 无法在 /my_file_location/test-this 中初始化字符集 utf8_general_ci(路径:/usr/share/mysql/charsets/)”。 php:21 堆栈跟踪:#0 /my_file_location/test-this.php(21): PDO->__construct('mysql:host=localhost', 'username', 'password') #1 {main} throw in /my_file_location /test-this.php 在第 21 行

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

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

我现在已将 utf8_general_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->__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 {}

    }

?>

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

【问题讨论】:

  • 开始的方法是阅读互联网上关于 pdo 的教程,你不只是将旧代码转储到 stackoverflow 上,并期望有人直接为你转换它,你好吗如果你不自己开始学习pdo,你显然是在错误的地方
  • 这个链接Migrate from MySQL Extension to PDO也许对你有帮助
  • 谢谢你,余家奥,至少你好心提供一个信息链接。非常感谢。
  • 太好了,您会在最后使用代码格式将其添加到您的问题中吗?这是一个更加集中的问题。我没有遇到过那个错误。值得一提的是您的操作系统和版本。
  • (如果这个问题结束了,基于当前版本,在你编辑完后联系我,我会考虑重新投票)。

标签: php mysql pdo


【解决方案1】:

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

ini_set('display_errors', false);

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

一旦您在当前站点上安装了它,您从这个旧数据库扩展迁移出去的任务就不会那么紧迫了。我的猜测是您现在使用的是 PHP 5.6,它仍然支持 mysql_ 函数,但您仍然需要为 7.x 做准备,它们已被删除。

【讨论】:

  • 感谢您的信息。是的,它似乎是 PHP 5.6.30
【解决方案2】:

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

utf8_general_ci 是一个collat​​ion,而你需要一个字符集,它被称为utf8,或者,更确切地说,现在应该是utf8mb4

让我向您推荐我的PDO tutorial,它将帮助您避免很多这样的困惑。

【讨论】:

  • 谢谢。我对 utf8 进行了更改,现在收到拒绝访问消息。我会看看你的教程。感谢您的链接。
【解决方案3】:

更新:好的,经过几天的阅读和探索,我设法提出了一个有效的重写。我现在有以下工作:

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

    }

?>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2015-05-30
    • 2020-05-28
    相关资源
    最近更新 更多