2017-04-12 35 views
-4

我的虛擬主機上的PHP最近已更新,現在我的舊MySQL查詢顯示「已棄用」錯誤消息。我需要將mysql_query代碼轉換爲PDO。這是我的開始:PDO錯誤:無法初始化字符集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 {} ?> 

<? } ?> 

我完全是新來的,不知道從哪裏開始。我也注意到,今天它現在說「沒有選擇數據庫」。

我已經atempting一行在PDO行重寫這個自己到目前爲止我得到:

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

我的第21行,在上面的錯誤引用,如下:

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

我現在已經改變了utf8_general_ci只是UTF8,現在有以下消息:

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

中號y Web主機使用Windows操作系統,我相信,它剛剛升級到5.6.30的PHP版本,但我不知道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

開始的方式是在互聯網上閱讀有關pdo的教程,您不只是將您的舊代碼轉儲到stackoverflow上,並期望有人直接將其轉換爲您,您將如何學習pdo if你不會自己啓動它,你顯然在錯誤的地方 – Ghost

+3

此鏈接[從MySQL擴展遷移到PDO](https://www.sitepoint.com/migrate-from-the-mysql-extension-to-pdo /)也許可以幫到你 –

+0

謝謝Yu Jiaao,至少對於提供鏈接信息來說足夠友善。非常感激。 – Blackhatter1

回答

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

    } 

?> 

現在我只希望我能弄清楚如何結果限制爲僅符合條件的前三排。到目前爲止,我嘗試了幾件事,但尚未成功。我想這是回到閱讀和測試,直到我找到有用的東西。

-1

正確立即解決方案是禁用顯示您的現場網站上的錯誤。這本來也應該做,因爲你永遠希望這些信息公開給用戶:

ini_set('display_errors', false); 

不這樣做你的非現場(試驗)的網站,只要你想看到的錯誤在那裏。

一旦您在當前網站上放置了這個選項,您從這個舊的數據庫擴展遷移的任務將不再緊急。我的猜測是你現在在PHP 5.6上,它仍然支持mysql_函數,但是你仍然需要爲7.x做準備,在那裏它們被刪除了。

+0

感謝您的信息。是的,它似乎是PHP 5.6.30 – Blackhatter1

0

錯誤消息很明顯:沒有這樣的字符集。從來沒有過。

utf8_general_ci是一個整理,而正確的字符集名字只是utf8

讓我推薦你我PDO tutorial這將有助於你避免很多類似這樣的混亂。

+0

謝謝。我改變了utf8,現在得到一個拒絕訪問的消息。我會檢查你的教程。感謝您的鏈接。 – Blackhatter1

相關問題