使用'&'字符的查询返回NULL,使用JS中的encodeURIComponent()和PHP中的urldecode()

三好国

我正在作为自己的第一个适当的网站工作,并且在使用特殊字符时无法查询数据库。我正在使用URI编码来帮助处理包含特殊字符(如“#”,“&”等)的查询。

基本上是这里发生的事情:我列出了数据库中的所有链接:

echo "<li><div class='trapez'><a onclick='getContent(this)';>{$row['title']}</a></div><br><br></li>";

然后,getContent(this)将AJAX请求发送到PHP文件

function getContent(e) {

    var name = encodeURIComponent(e.innerHTML);

    var xhttp = new XMLHttpRequest();

    xhttp.onreadystatechange = function() {
        if ((this.readyState == 4) && (this.status == 200)) {
            document.getElementById("main").innerHTML = this.responseText;
        }
    };
    xhttp.open("POST", "./getSideContent.php?q=" + name , true);
    xhttp.send();

}

之后,PHP文件解码字符串并使用准备好的语句查询数据库以获取内容:

$q = urldecode($_REQUEST["q"]);

$stmt = $link->prepare("SELECT heading, content, created_at FROM tab_posts WHERE title= ?");
$stmt->bind_param("s", $title);
$title = $q;
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();

现在,内容已准备好由网站显示,但似乎在使用&字符时,查询中出现了错误,并且该语句返回NULL。

这是的var_dump$_REQUEST['q']其中包含“#”的查询结果

string(12) "Test post #2"

object(mysqli_result)#3 (5) {
  ["current_field"]=>
  int(0)
  ["field_count"]=>
  int(3)
  ["lengths"]=>
  array(3) {
    [0]=>
    int(0)
    [1]=>
    int(3)
    [2]=>
    int(19)
  }
  ["num_rows"]=>
  int(1)
  ["type"]=>
  int(0)
}

现在包含&:

string(15) "Test & post"

object(mysqli_result)#3 (5) {
  ["current_field"]=>
  int(0)
  ["field_count"]=>
  int(3)
  ["lengths"]=>
  NULL
  ["num_rows"]=>
  int(0)
  ["type"]=>
  int(0)
}

顺便说一句,应该附加一个图像,显示数据库中存在该条目。

即使变量看起来正确,查询也将返回NULL,并且不会加载任何内容。这里发生了什么?我究竟做错了什么?另外,请不要给我“糟糕的代码”注释,这是我的第一个项目,我正在学习。

miken32

您需要始终为适当的显示环境准备输出。对于URL,您已正确完成。对于HTML,htmlspecialchars()在输出的所有内容上使用:

<?php
$title = htmlspecialchars($row["title"]);
echo <<< HTML
    <li>
        <div class="trapez">
            <a onclick="getContent(this)">$title</a>
        </div>
        <br/><br/>
    </li>
HTML;

尽管更好的方法是传递有关行的数据库ID:

<?php
$id = htmlspecialchars($row["id"]);
$title = htmlspecialchars($row["title"]);
echo <<< HTML
    <li>
        <div class="trapez">
            <a onclick="getContent($id)">$title</a>
        </div>
        <br/><br/>
    </li>
HTML;

function getContent(id) {    
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if ((this.readyState == 4) && (this.status == 200)) {
            document.getElementById("main").innerHTML = this.responseText;
        }
    };
    xhttp.open("GET", "./getSideContent.php?q=" + encodeURIComponent(id) , true);
    xhttp.send();

}

然后,您的PHP可以更有效地进行搜索:

$stmt = $link->prepare("SELECT heading, content, created_at FROM tab_posts WHERE id = ?");

如果您只是在学习,则应该欢迎批评您的代码。您仅在此处分享了一些简短的摘要:

  • 而不是返回HTML,您应该返回JSON数据,并让您的JavaScript回调处理创建HTML元素的外观方面
  • 您应该将事件侦听器附加到单独的JS文件中的元素上,而不要使用老式的HTML属性,例如 onclick
  • jQuery将为您节省很多工作,您应该使用它
  • 不要使用$_REQUEST,这会导致草率的代码,例如...
  • 您的JavaScript通过POST发送表单,但您要将数据附加到URL
  • 无需致电,urldecode()因为您的Web服务器已经做到了
  • PDO比mysqli更容易使用,现代数据库框架甚至更容易

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Python和py-postgresql返回的查询中的空格

使用.htaccess隐藏PHP中的查询字符串

在SPARQL查询中的查询字符串外部使用声明的变量-使用JSP和Java Servlet

使用in_array()清理SQL和PHP中的查询

使用MYSQL和PHP查询以逗号分隔的字符串返回项目的完全匹配

Firebase 使用“order by”和“where”查询返回 null

如何使用php和regex从文本中删除特殊字符

如何在2D字符数组中查找单词并返回JS中未使用的字符?

在 ACCESS 查询中强制使用 NULL 条目

使用objection.js或knex.js在Postgres中的字符串列的json数组中查询

使用字符“?” 在SQL查询中的codeigniter

递归函数返回数组值,使用php中该函数之外的sql查询中的值

在PHP中,何时使用::和何时使用->

使用实体框架在查询中返回空字符串条件不起作用

SQL使用函数在select where in(..)查询中返回了字符串

在嵌套AND和OR函数中查询使用CASE

使用 AND 和 Where 卡在 laravel 查询中

使用或查询从嵌套查询中返回单个元素

使用 PHP 在 HTML 中回显 css 和 js 的内容

使用mybatis时如何从查询中更改值(从null到空字符串)?

使用php在mysql中插入查询错误

使用getJson的php查询中的变量

使用php中的几个条件的mongodb查询

使用PHP在SOAP查询中呈现的数组

在 php 中的 sql 查询中使用变量

如何使用PHP内置服务器在PHP中获取查询字符串?

使用Node JS在MongoDb中聚合查询

使用base 64编码的字符串在shell脚本中返回空或null

使用php从数组中返回特定值