我的动态下拉列表中的特殊字符问题

时间:2013-09-19 20:20:16

标签: javascript php jquery mysql dynamic

我使用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

感谢您帮助实现这一目标!这似乎不应该太难我只是不确定我应该如何告诉脚本保持一切正确的编码。

2 个答案:

答案 0 :(得分:0)

要实现这一点,一切都需要端到端设置为utf8 因此,您的内容类型需要明确设置为utf8(如上所述) JavaScript无缝地通过utf8编码。 使用utf8编码PHP基本上没问题但是有一些功能可以打破它 - 看看这里 http://blog.loftdigital.com/blog/php-utf-8-cheatsheet

您的数据库编码是否设置为utf8?将数据库意外地设置为latin1(一些Web主机将其作为默认值)非常容易,您需要将数据库和每个表设置为utf8。

最后,当您将非拉丁字符复制并粘贴(或键入)到数据库中时,是否使用了utf8友好编辑器?例如,我经常使用Navicat8 for MySQL,但这与utf8不能很好地配合使用。从Microsoft Word复制和粘贴也可以为字符编码做些讨厌的事情!

希望这是有帮助的

克雷格

答案 1 :(得分:0)

也许尝试这样的事情:

$("#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);

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

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