【问题标题】:Problems with special characters in my dynamic dropdown [duplicate]我的动态下拉列表中的特殊字符问题[重复]
【发布时间】:2013-09-19 20:20:16
【问题描述】:

我已经使用 JS/PHP/MySQL 创建了一个动态下拉列表,但似乎我在使用特殊字符时遇到了一些问题。该脚本将用于制作一个小型应用程序,帮助我的客户找到符合他们标准的产品。我们销售可以接受不同输入范围的面板仪表,其中许多都用 +/- 或一个值表示(例如:仪表可以预期处理指定电压附近 +/- 10V 的电压。)一切都开始运转良好在我的脚本中,除非通过(+、/、±、½ 等)解析某些字符特殊字符问题,但它没有......此外,当使用 ± 时,该字符应该作为未知字符出现(所以在某处我的编码设置也错误。)

所以现在我仍然需要弄清楚为什么有些东西解析不正确。

您可以在http://new.foxmeter.com/find.php查看脚本的实时版本

这是我前端的重要部分

    <script src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script>        
        $(function(){
            $("#type").change(function() {
                var tval = document.getElementById('type').value;
                $("#range").load(encodeURI("findbackend.php?type=" + tval));
            });
            $("#range").change(function() {
                rval = document.getElementById('range').value;
                $("#power").load(encodeURI("findbackend.php?range=" + rval));
            });
            $("#power").change(function() {
                //var rval = document.getElementById('range').value;
                psval = document.getElementById('power').value;
                $("#setpoint").load(encodeURI("findbackend.php?range=" + rval + "&power=" + psval));
            });
            $("#setpoint").change(function() {
                //var rval = document.getElementById('range').value;
                //var psval = document.getElementById('power').value;
                stval = document.getElementById('setpoint').value;
                $("#output").load(encodeURI("findbackend.php?range=" + rval + "&power=" + psval + "&setpoint=" + stval));
            });
          });
    </script>

</head>
<body>
    <!-- Google Analytics Script -->
    <?php include_once("scripts/analyticstracking.php") ?>

    <div class="wrapper"> <!-- Sticky Footer Wrapper -->
        <div id="panorama"></div>
        <div id="header">
            <?php include("include/header/banner.php") ?>
            <?php include("include/header/nav.php") ?>
            <?php include("include/header/quicksearch.php") ?>
        </div>
        <div id="content">
            <div id="findoptions">
                <select id="type" class="finddrops">
                    <option selected value="base">Please Select</option>
                    <option value="DC Voltage">DC Voltage</option>
                    <option value="DC Current">DC Current</option>
                    <option value="AC Voltage">AC Voltage</option>
                    <option value="AC Current">AC Current</option>
                    <option value="Strainguage">Strainguage</option>
                </select>
                <br>
                <select id="range" class="finddrops">
                    <option>Please choose from above</option>
                </select>
                <br>
                <select id="power" class="finddrops">
                    <option>Please choose from above</option>
                </select>
                <br>
                <select id="setpoint" class="finddrops">
                    <option>Please choose from above</option>
                </select>
                <br>
                <select id="output" class="finddrops">
                    <option>Please choose from above</option>
                </select>
                <br>
                <select id="blarg" class="finddrops">
                    <option>Please choose from above</option>
                </select>                   
            </div>
            <div id="findresults" class="finddrops">
            </div>
        </div>
    </div>
    <div class="footer"> 
        <?php include("include/footer/footer.php") ?>
    </div>

这是我在后端运行的 PHP:

<?php
    //\\ MODULAR DEPENDANT DROPDOWNS \\//

    //creates DB connection
    $dbHost = 'host';
    $dbUser = 'user'; 
    $dbPass = 'pass';
    $dbDatabase = 'database';
    $con = mysql_connect($dbHost, $dbUser, $dbPass) or trigger_error("Failed to connect to MySQL Server. Error: " . mysql_error());

    mysql_select_db($dbDatabase) or trigger_error("Failed to connect to database {$dbDatabase}. Error: " . mysql_error());

    //prevents injections
    //any order
    $type = mysql_real_escape_string(urldecode($_GET['type']));
    isset($_GET['range'])?$range = mysql_real_escape_string(urldecode($_GET['range'])):"";
    isset($_GET['power'])?$power = mysql_real_escape_string(urldecode($_GET['power'])):"";
    isset($_GET['setpoint'])?$setpoint = mysql_real_escape_string(urldecode($_GET['setpoint'])):"";

    //forms the query depending on what data is recieved through GET
    //first option on the bottom; last option on the top to avoid conflicts 
    if (isset($_GET['setpoint'])) {
        $query = "SELECT DISTINCT stp FROM meters WHERE sio='$range' AND pso='$power' AND stp='$setpoint' ORDER BY model";
    } elseif (isset($_GET['power'])) {
        $query = "SELECT DISTINCT stp FROM meters WHERE sio='$range' AND pso='$power' ORDER BY model";
    } elseif (isset($_GET['range'])) {
        $query = "SELECT DISTINCT pso FROM meters WHERE sio='$range' ORDER BY model";
    } else {
        $query = "SELECT DISTINCT sio FROM meters WHERE sit LIKE '%$type%' ORDER BY model";
    }

    //creates a result array from query results
    $result = mysql_query($query);

    //outputs dropdown options dependent on what GET variables are set
    //first option on the bottom; last option on the top to avoid conflicts
    if (isset($_GET['setpoint'])) {
        while ($row = mysql_fetch_array($result)) {
            echo "<option value='" . $row{'stp'} . "'>" . $row{'stp'} . "</option>";
        }
    } elseif (isset($_GET['power'])) {
        echo "<option>Choose Setpoint Options</option>";
        while ($row = mysql_fetch_array($result)) {
            $row{'stp'} = ucfirst($row{'stp'}); //capitalizes the first letter; necessary?
            echo "<option value='" . $row{'stp'} . "'>" . $row{'stp'} . "</option>";
        }
    } elseif (isset($_GET['range'])) {
        while ($row = mysql_fetch_array($result)) {
            echo "<option value='" . $row{'pso'} . "'>" . $row{'pso'} . "</option>";
        }
    } else {
        while ($row = mysql_fetch_array($result)) {
            echo "<option value='" . $row{'sio'} . "'>" . $row{'sio'} . "</option>";
        }
    }

    //Thanks to Chris Coyier for the wonderful examples on CSS-Tricks
    //A Web Application by Zach Klemp
?>

再次,您可以查看脚本here

感谢所有帮助使其正常工作!看起来这应该不会太难我只是不确定我应该如何告诉脚本将所有内容保持在正确的编码中。

【问题讨论】:

  • 这个 mysql 扩展自 PHP 5.5.0 起已弃用,并将在未来被删除。相反,应该使用 MySQLi 或 PDO_MySQL 扩展。见php.net/manual/en/mysqlinfo.api.choosing.php
  • 您是否尝试将 添加到您的 中?
  • @nullability,我知道我稍后会处理。不过谢谢!
  • 您的网页使用 UTF-8 并且您的数据库使用 UTF-8 非常重要。通过始终使用 UTF-8,您可以避免这些字符的编码问题。

标签: javascript php jquery mysql dynamic


【解决方案1】:

为此,所有内容都需要端到端设置为 utf8 所以你的内容类型需要明确设置为 utf8 (如上) JavaScript 无缝地通过 utf8 编码。 PHP 大部分都可以使用 utf8 编码,但是有一些函数会破坏它 - 看看这里 http://blog.loftdigital.com/blog/php-utf-8-cheatsheet

您的数据库编码设置为 utf8 吗?很容易意外地将数据库设置为 latin1(一些网络主机将其作为默认设置),您需要将数据库和每个表设置为 utf8。

最后,当您将非拉丁字符复制并粘贴(或键入)到数据库中时,您使用的是 utf8 友好的编辑器吗?例如,我经常将 Navicat8 用于 MySQL,但它与 utf8 并不能很好地配合使用。从 Microsoft Word 复制和粘贴也会对字符编码造成不良影响!

希望对你有帮助

克雷格

【讨论】:

  • 嗨!我刚刚向我的数据库发送了一个查询以将其设置为 UTF8,以防万一,尽管我确定我是这样设置的。同样,我正在使用 Heidi 来管理我的远程数据库,到目前为止,我的特殊字符没有问题。它显示一切正常。我原始帖子的评论者说 htmlentities 可能是我通过脚本对特殊字符进行编码和解码所需要的,但我仍在试图弄清楚我应该在哪里使用这个函数。
【解决方案2】:

也许可以试试这样的:

$("#power").load(encodeURI("findbackend.php?range=" + rval.replace("+","&#43;").replace("-","&#45;").replace("/","&#47;"));

基本上只是用html编码替换特殊字符...加号和反斜杠是URL字符串中的保留字符。

编辑: 你也可以试试 encodeURIComponent:

rval = encodeURIComponent(document.getElementById('range').value);

编辑 2 好的,这似乎对我有用,所以试试吧:

确保在您的页面上设置 html 编码

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

在你的 php 中使用

header('Content-Type: text/html; charset=utf-8');

确保你使用

rval = encodeURIComponent(document.getElementById('range').value);

对通过 url 传递的值进行编码。

$_GET 会自动解码传入的参数,因此您应该能够只使用从那里检索到的 sql 语句中的参数字符串。

【讨论】:

  • 这可能是最简单的(虽然 hacky)方式。不过,并非输入下拉列表(第二个下拉列表)中的每个选项的名称中都包含 +、- 或 ±。我会试试这个,看看我喜欢它。
  • 如果我尝试 encodeURIComponent() 我应该能够在我的字符串通过 GET 发送之前删除 encodeURI,对吗?
  • 虽然我已经在使用它,所以它可能无法正常工作....JS 已经对 URI 进行了编码,然后我的 PHP 在开始附近定义变量时对其进行解码。
  • hmmm...我认为 encodeURI 在这种情况下实际上不会对您有所帮助...developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 声明 encodeURI “假设 URI 是一个完整的 URI,因此不编码保留在 URI 中具有特殊含义的字符。”其中“+”是保留字符。
  • 你能记录下 encodeURIComponent(document.getElementById('range').value); 的结果吗?到控制台看看它是否为你正确编码?
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多