php - 如何在php slimframwork中插入包含非英文字母的数据

标签 php mysql slim

我正在使用 PHP slim 框架开发 API。我可以获取和删除,但在插入 (POST) 和更新 (PUT) 时,我遇到了问题。

    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;

 }
}

当我使用 rest easy 时,我收到 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

在我遇到瑞典字母问题之前,它无法在浏览器中正确显示。如果有人遇到同样的问题,您可以使用该 header 解决此问题。它适用于所有非英文字母

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,我希望您也考虑一下。 我将感谢您的帮助,并请加入此讨论。如果我们解决这个问题,这将是对非英语字母问题的很好的研究。我几乎一整天都在谷歌上搜索,但没有找到解决方案。

最佳答案

您已经使用了 SET NAMES,这是正确的方法,但是您需要将 utf8 括在单引号内,as defined in the MySQL documentation

SET NAMES 'charset_name' [COLLATE 'collation_name']

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

关于php - 如何在php slimframwork中插入包含非英文字母的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46787760/

相关文章:

php - 在 .twig 文件 slim 框架中使用 php 代码

php - 创建 MVC Web 应用程序的步骤

php - 我在带有 PHP 7 的 Ubuntu 16 上安装了 cURL,但我仍然调用未定义的函数 curl_init()

php - android、php、mysql之间通讯失败

mysql - 显示上个月和上一年的记录

mysql - 如何对数组中的特定字段进行分组?

php - 如何获取启用了 php 的 apache 模块列表

php - 我应该如何将 HTML 标签存储到数据库中?

php - 用于跟踪项目生命周期事件的数据库结构

php - 指导我使用 phpleague 库实现 Oauth2 PHP 服务器