-1

我已经使用 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
?>

同样,您可以在此处查看脚本。

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

4

2 回答 2

0

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

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

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

希望这会有所帮助

克雷格

于 2013-09-19T20:30:38.807 回答
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);

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

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

于 2013-09-19T20:35:18.400 回答