Php 存储为%20的字符串之间的MYSQL db空间

Php 存储为%20的字符串之间的MYSQL db空间,php,Php,这可能看起来很傻,但我发现我的表中有%20个字符的列。它只在这个专栏里。当我发布文章时,我连接了两个文本,如$mtxt.“示例文本”。列中的文本类似于此%20sample%20text。该列是varchar和utf8通用排序规则。其他专栏没有这个问题 我正在使用jqueryget方法。像这样 $.get("https://xys.co.in/xys/xys.php/xys/"+xys+"/"+xya, function(data){}); php中的下一步 $urlParams = explo

这可能看起来很傻,但我发现我的表中有%20个字符的列。它只在这个专栏里。当我发布文章时,我连接了两个文本,如
$mtxt.“示例文本”
。列中的文本类似于
此%20sample%20text
。该列是varchar和utf8通用排序规则。其他专栏没有这个问题

我正在使用jqueryget方法。像这样

$.get("https://xys.co.in/xys/xys.php/xys/"+xys+"/"+xya, function(data){});
php中的下一步

$urlParams = explode('/', $_SERVER['REQUEST_URI']); 
$functionName = $urlParams[x]; 
$functionName($urlParams,$conn);

function _xyz($urlParams,$conn){  
$xyz= mysqli_real_escape_string($urlParams[x]);
$sql ="Insert into `xyz` (x) values ('$xyz')"
if (mysqli_query($mysqli, $sql)) {
     echo "New record created successfully ".'$to'.'$s';
  } else {
    echo "Error: Insert " . mysqli_error($mysqli);
    exit();
  }
}
jQuery将是您的文本,以便它生成有效的URL(因为URL不能包含空格)。发送此类自由文本数据的一种更明智的方法是在POST请求中作为正文参数。这样,您就不会有像您找到的那样的问题,或者长度或URL方面的问题,或者需要执行任何拆分URL字符串以获取数据的工作。您还应该更改mysqli代码,使其不易受到SQL注入攻击等

此外,您确实不应该允许代码基于URL中的内容执行任何任意函数名。您至少需要将允许的操作列为白名单,否则您将面临一个充满漏洞的世界。动作名称也不应该直接反映PHP中的函数名

简单的例子:

jQuery:

$.post( //post instead of get
  "https://xys.co.in/xys/xys.php", 
  { "action": "xys", "xys": xys, "xya": xya }, //data object containing your parameters, to be passed in the request body
  function(response){ console.log(response); }
);
PHP:

还请注意,此处缺少明确的错误处理。相反,通常最好先让您的程序的异常处理程序处理它们(如果需要,也可以使用try/catch块)。这将大大减少代码中的混乱。将异常详细信息直接输出到实时应用程序的页面中也是一个坏主意——相反,将异常详细信息记录到服务器上的日志文件中,并在前端输出一条通用的用户友好消息,而不包含任何技术细节

有关准备好的语句和参数化的更多信息,请参阅

有关jQuery
$.post
函数的更多信息,请参阅

另外,我一直坚持使用您的变量名,因为这里没有其他可使用的内容,但一般来说,您应该尝试使用有意义的变量名,而不是缩写或随机字符-这使您的代码更易于阅读和维护。

jQuery将成为您的文本,以便生成有效的URL(因为URL不能包含空格)。发送此类自由文本数据的一种更明智的方法是将其作为POST请求中的正文参数。这样,您就不会遇到像您所发现的那样的问题,也不会出现长度或URL问题,或者需要进行任何拆分URL字符串以获取数据的工作。此外,您还应该更改mysqli代码,使其不易受到攻击QL注入攻击等

此外,您真的不应该允许代码根据URL中的内容执行任何任意函数名。您至少需要将允许的操作列为白名单,否则您可能会面临大量漏洞。并且操作名也不应该直接反映PHP中的函数名

简单的例子:

jQuery:

$.post( //post instead of get
  "https://xys.co.in/xys/xys.php", 
  { "action": "xys", "xys": xys, "xya": xya }, //data object containing your parameters, to be passed in the request body
  function(response){ console.log(response); }
);
PHP:

还要注意这里没有明确的错误处理。相反,通常最好先让程序的异常处理程序处理它们,然后让它来处理(如果需要的话,也可以使用try/catch块)。这将大大减少代码中的混乱。将异常详细信息直接输出到实时应用程序的页面中也是一个坏主意-相反,将异常详细信息记录到服务器上的日志文件中,并在前端输出一条通用的用户友好消息,而不包含任何技术详细信息

有关准备好的语句和参数化的更多信息,请参阅

有关jQuery
$.post
函数的更多信息,请参阅


另外,我一直坚持使用您的变量名,因为这里没有其他可使用的名称,但一般来说,您应该尝试使用有意义的变量名,而不是缩写或随机字符-这会使您的代码更易于阅读和维护。

向我们展示如何保存数据。您从哪里获取数据?您确定它不是p吗输入的艺术?请使用jQuery和PHP代码更新问题。不要在注释中添加额外的细节。这是无法理解的。您知道您刚刚打开了整个服务器,使其受到远程代码执行攻击吗?您仍然没有向我们展示如何将数据插入数据库。您在哪里解码URL参数?使用
rawurldecode()
来解码URL部分。但是,您给我们看的代码真的很糟糕,我建议立即删除它并用新的想法重新开始。不要使用此代码!使用
die(mysqli\u error($conn))是一个非常糟糕的主意;
在您的代码中,因为它可能会泄漏敏感信息。请参阅本文了解更多说明:向我们展示如何保存数据。您从何处获取数据?您确定它不是输入的一部分吗?请使用jQuery和PHP代码更新问题。不要在注释中添加额外的详细信息。这是无法理解的,您知道您您的整个服务器刚刚被远程代码执行攻击打开?您仍然没有向我们展示如何将数据插入数据库。您在哪里解码URL参数?使用
rawurldecode()
来解码URL部分。但是,您给我们看的代码真的很糟糕,我建议立即删除它并用新的想法重新开始。不要使用此代码!使用
die(mysqli\u error($conn))是一个非常糟糕的主意
在您的代码中,因为它可能会泄露敏感信息。有关更多解释,请参阅本文:对于一个糟糕的问题,您可以获得我的投票,以获得一个真正彻底的答案。@ADyson感谢您的回答。事实上,我没有使用post函数cos,因为发生了很多不同类型的请求使用post会让我编写很多php文件,而我使用的get方法可能会在一个文件中包含很多函数。我将使用prepared语句方法来代替。@Dharman the
rawurldecode