在 URL 中使用另一个 url 作为参数时会被`&`截断的问题

在URL中使用另一个url作为参数时会被&截断的问题

下午帮同事写一个url转二维码的小工具时,发生标题中描述的问题。比如:输入的url是http://www.example.dev/name=user&code=2000,转换为二维码后,扫描得到的url却是http://www.example.dev/name=user,&后的部分没有正确转换。问题很明显,作为参数的url中的&后的被解析为其他参数了。

前台请求的完整url是"http://{domain}/tools/getQrCode.php?url=http://www.example.dev/name=user&code=2000,后台从$_GET['url']中取得却是http://www.example.dev/name=user,另一部分成了$_GET['code']了。

解决方法其实很简单,给作为参数的url做一下urlencode就好了。js中可以直接使用encodeURIComponent函数为url编码。

代码示例如下:

  • 后台php
<?php

$url = isset($_GET['url']) ? $_GET['url'] : '';
if (empty($url)) {
    echo '<div class="alert alert-danger" role="alert">请输入url!</div>';
    exit(1);
}
echo genQrCode($url);
exit(0);

function genQrCode($url=''){
    require_once 'libs/phpqrcode.php';
    $value = $url;                  //二维码内容

    $errorCorrectionLevel = 'L';    //容错级别
    $matrixPointSize = 5;           //生成图片大小

    //生成二维码图片
    $filename =  '/../tmp/'.microtime().'.png';
    QRcode::png($value, dirname( __FILE__ ) . $filename, $errorCorrectionLevel, $matrixPointSize, 2);

    return '<img src="tmp'. $filename . '"><br><p>' . $url . '</p>';
}
  • 前台html和js
之前的部分略
        <div class="col-md-6 col-lg-6">
            <div class="panel panel-warning">
                <div class="panel-heading">二维码转换</div>
                <div class="panel-body">
                    <form>
                        <div class="form-group">
                            <label for="url">url</label>
                            <input type="text" class="form-control" id="url" placeholder="url">
                        </div>
                        <button type="button" id="getQr" class="btn btn-primary">生成二维码</button>
                        <button type="reset" class="btn btn-success">清除url</button>
                    </form>
                </div>

                <div id="qrdiv" class="panel-body" style="word-break: break-all;">

                </div>
            </div>
        </div>
    </div>
</div>
<script type="text/javascript">
    $(
        $("#getQr").click(function () {
            $qrstr=$("#url").val();
            $url = "tools/getQrCode.php?url=" + encodeURIComponent($qrstr);
            $.get($url, function (result) {
                $("#qrdiv").html(result);
            });
        })
    );
</script>
</body>
</html>

PS:样式部分使用的bootstrap3

PS:虽然一定会被认为是很低端的问题,没有什么记录的意义,就是随便写写,仅此而已。
以上

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1
xin6841414

帮到我了, 谢谢

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!