2017-10-17 120 views
1

我正在使用PHP slim框架開發API。我可以通過插入(POST)和更新(PUT)來GET和DELETE,但我遇到了問題。如何在php中插入包含非英文字母的數據slimframwork

class db { 
     //Propertise 
     private $dbhost = 'localhost'; 
     private $dbuser = 'root'; 
     private $dbpass = ''; 
     private $dbname = 'bralivnara-api'; 
     //Connect 
     public function connect(){ 
      try { 
       $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', 'CHARSET utf8'); 
       $dbConnection = new PDO("mysql:host=$this->dbhost;dbname=$this->dbname;", $this->dbuser, $this->dbpass, $options); 
       // set the PDO error mode to exception 
       $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
       //echo "Connected successfully"; 
      } 
      catch(PDOException $e) 
      { 
       echo "Connection failed: " . $e->getMessage(); 
      } 
      return $dbConnection; 

} 
} 

當我使用休息容易我收到500錯誤。

Response Status: 500 (Internal Server Error) 

當我通過URL,然後按在瀏覽器中輸入,它顯示的錯誤

Connection failed: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'add' at line 1 

之前,我曾與瑞典信也,它不是在瀏覽器中正確顯示的問題。如果任何人有同樣的問題,你可以解決這個問題與該標題。它將適用於所有非英文字母

return $response->withStatus(200) 
->withHeader('Content-Type', 'application/json;charset=utf-8;') 
->write(json_encode($tranasVcDatainsamling, JSON_UNESCAPED_UNICODE)); 

如果您想查看完整的獲取代碼,請參加我們的討論。

現在仍然存在的最後一個問題是插入數據庫。這裏是插入數據庫的代碼。

$app->post('/api/tranas-vc/add', function (Request $request, Response $response){ 
    $besöksdatum = $request->getParam('besöksdatum'); 
    $kön = $request->getParam('kön'); 
    $ålder_år = $request->getParam('ålder_år'); 
    $sökorsak = $request->getParam('sökorsak'); 
    $vp_objektiv_prio = $request->getParam('vp_objektiv_prio'); 
    $vp_objektiv_variabel_med_högst_prio = $request->getParam('vp_objektiv_variabel_med_högst_prio'); 
    $vp_mätning_prio = $request->getParam('vp_mätning_prio'); 
    $vp_mätning_variabel_med_högst_prio = $request->getParam('vp_mätning_variabel_med_högst_prio'); 
    $ess_val = $request->getParam('ess_val'); 
    $prio_ess = $request->getParam('prio_ess '); 
    $prio_total = $request->getParam('prio-total'); 
    $utskrivning_hänvisning_återbesök = $request->getParam('utskrivning_hänvisning_återbesök'); 
    $åtgärd_remiss = $request->getParam('åtgärd_remiss'); 
    $om_lab_vilka_prover = $request->getParam('om-lab-vilka-prover'); 

    $sql = "INSERT INTO 
    `tranasvcdatainsamling` 
    (
     `besöksdatum`, 
     `kön`, 
     `ålder_år`, 
     `sökorsak`, 
     `vp_objektiv_prio`, 
     `vp_objektiv_variabel_med_högst_prio`, 
     `vp_mätning_prio`, 
     `vp_mätning_variabel_med_högst_prio`, 
     `ess_val`, 
     `prio_ess`, 
     `prio_total`, 
     `utskrivning_hänvisning_återbesök`, 
     `åtgärd_remiss`, 
     `om_lab_vilka_prover` 
    ) 
    VALUES 
    (
     :`besöksdatum`, 
     :`kön`, 
     :`ålder_år`, 
     :`sökorsak`, 
     :`vp_objektiv_prio`, 
     :`vp_objektiv_variabel_med_högst_prio`, 
     :`vp_mätning_prio`, 
     :`vp_mätning_variabel_med_högst_prio`, 
     :`ess_val`, 
     :`prio_ess`, 
     :`prio_total`, 
     :`utskrivning_hänvisning_återbesök`, 
     :`åtgärd_remiss`, 
     :`om_lab_vilka_prover` 
    )"; 
    try { 
     // Get DB Objects 
     $db = new db(); 
     // Connect 
     $db = $db->connect(); 
     // Execute Query 
     $stmt = $db->prepare($sql); 
     $stmt->bindParam(':besöksdatum', $besöksdatum); 
     $stmt->bindParam(':kön', $kön); 
     $stmt->bindParam(':ålder_år', $ålder_år); 
     $stmt->bindParam(':sökorsak', $sökorsak); 
     $stmt->bindParam(':vp_objektiv_prio', $vp_objektiv_prio); 
     $stmt->bindParam(':vp_objektiv_variabel_med_högst_prio', $vp_objektiv_variabel_med_högst_prio); 
     $stmt->bindParam(':vp_mätning_prio', $vp_mätning_prio); 
     $stmt->bindParam(':vp_mätning_variabel_med_högst_prio', $vp_mätning_variabel_med_högst_prio); 
     $stmt->bindParam(':ess_val', $ess_val); 
     $stmt->bindParam(':prio_ess', $prio_ess); 
     $stmt->bindParam(':prio_total', $prio_total); 
     $stmt->bindParam(':utskrivning_hänvisning_återbesök', $utskrivning_hänvisning_återbesök); 
     $stmt->bindParam(':åtgärd_remiss', $åtgärd_remiss); 
     $stmt->bindParam(':om_lab_vilka_prover', $om_lab_vilka_prover); 
     $stmt->execute(); 
     echo '{"notice": {"text": "Tranås VC Entry Added"}'; 
    } catch(PDOEception $e) { 
     echo '{"error": {"text": '.$e->getMessage().'}'; 
    } 
}); 

我們做的代碼一切可能的實驗中,你可以看到在評論這些建議,但我們仍然在POST和PUT出現了問題。

我評論了$ stmt-> execute();停止查詢和檢查的執行,我在休息中取得了200次成功,但數據未插入。我瀏覽器的錯誤是一樣的。它表明問題正在執行中。我檢查了英文字母數據類型的代碼,它正在工作。

我非常確定,由於瑞典文是非英文的,所以我遇到了問題。

我的數據庫,包含瑞典的字母列看起來像

kön varchar(125) latin1_swedish_ci 
sökorsak varchar(125) latin1_swedish_ci 

其中latin1_swedish_ci顯示,我想你也考慮。 我會感謝您的幫助,請加入討論。如果我們解決這個問題,它將非常好的研究非英文字母問題。我谷歌幾乎整天,但沒有得到解決方案。

+0

不知道如何PHP/MySQL的手柄這樣的字符,我們可以看到你收到的錯誤嗎? – IsThisJavascript

+0

@ziaullahzia使用編碼UTF8通用ci的數據庫,可以添加所有語言。使用utf8_encode utf8_decode。問候。 http://php.net/manual/en/function.utf8-encode.php https://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode -ci – 2017-10-17 10:18:08

+0

您應該避免在不是ascii的任何事情中使用POST參數。和表中的字段一樣。你可以插入非ascii的_data_就好了,但是結構應該遵循更嚴格的模式。 – OptimusCrime

回答

1

你已經使用SET NAMES這是正確的做法,但你需要用一個單引號裏面的utf8as defined in the MySQL documentation

SET NAMES 'charset_name' [COLLATE 'collation_name']

$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'", 'CHARSET utf8'); 
                  ^^
相關問題