【问题标题】:Not sure if .htaccess file is correct. Also some fetch problems from mySQL不确定 .htaccess 文件是否正确。还有一些来自 mySQL 的 fetch 问题
【发布时间】:2016-04-21 22:24:46
【问题描述】:

在我实现了更干净的 URL 路径后,我在从 mySQL 数据库获取数据时遇到了一些问题。

代替:www.example.com/index.php?id=headline

我会有这样的路径:www.example.com/article/headline

我的 .htaccess 文件看起来像这样,并且路径似乎有效:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f


RewriteCond %{THE_REQUEST} (\s|%20)
RewriteRule ^([^\s%20]+)(?:\s|%20)+([^\s%20]+)((?:\s|%20)+.*)$ $1-$2$3 [N,DPI]
RewriteRule ^([^\s%20]+)(?:\s|%20)+(.*)$ /$1-$2 [L,R=301,DPI]

RewriteRule ^article/(.*)/?$ index.php?id=$1 [NC,L]

RewriteCond %{REQUEST_URI} !\.(gif|jpg|png|ico|css|js)$

那么这是您必须点击的链接,才能进入文章页面:

<a href="article/'. urldecode($row["overskrift"]) .'">

并且从这个 $row 中获取数据进展顺利。

问题是当我必须 $_GET id 时,就好像它无法正确获取下一步:

if(isset($_GET['id'])) { 
   $id = $_GET['id'];
   $DB = "SELECT * FROM post WHERE overskrift = " . $id;
   $fetch=$conn->query($DB);
   $blogpost = $fetch->fetch_assoc();

最后一行出现了一个错误,我已经在这个问题上挣扎了大约 3 个小时,但我真的找不到有问题的地方! 我可以点击首页文章上的链接,但是当我尝试输入文章时出现此错误:

致命错误:在第 198 行的 /var/www/web/xxxxxxx/xxxxx.com/index.php 中的非对象上调用成员函数 fetch_assoc()

希望有人能帮忙。

【问题讨论】:

  • 查询失败。 $id 是什么?您编写查询的方式使您面临 SQL 注入。您应该使用准备好的语句。
  • $id 在 .htaccess 文件中设置为 id=$1。那就是 (。*)。然后在我的href中,我将它设置为 $row["overskrift"] Overskrift=headline (丹麦语) 所以我的想法是 $id 将是数据库的标题。然后我说 $id 应该等于 mySQL 语句中的标题。但是它似乎不起作用

标签: php mysql .htaccess


【解决方案1】:

在重写规则匹配中添加前导 /:

RewriteRule ^/article/(.*)/?$ index.php?id=$1 [NC,L]

请注意,这会将www.example.com/article/headline/something/else/ 重写为www.example.com/index.php?id=headline/something/else,如果不需要,请使用更严格的字符集(如[A-z0-9_\- \.])而不是.*

对于 SQL,绝对建议使用PDO 或类似的方法来参数化来自请求变量的任何内容。在使用变量之前,还值得对变量做一些filter/sanitize

值得在运行之前输出您的 SQL,以便您可以看到它与您期望的一样。还可以尝试复制该输出并直接在 mysql 命令行中或通过 PHPMyAdmin(或其他类似工具)运行它,以查看是否获得了预期的数据。

if(isset($_GET['id'])) { 
   $id = $_GET['id'];
   $DB = "SELECT * FROM post WHERE overskrift = " . $id;
   echo '<pre>' . $DB . </pre>;
   $fetch=$conn->query($DB);
   $blogpost = $fetch->fetch_assoc();

编辑

在上面看到您的回复。您的 SQL 的问题是您正在传递一个字符串,但没有将其封装在 SQL 中(注意 PDO 参数化会自动为您服务)。您的 SQL 行应为:

$DB = "SELECT * FROM post WHERE overskrift = '" . $id . "'";

但是说真的.. 不要这样做。参数化它!

【讨论】:

  • 如果我像你说的那样重写规则,它会显示 404。如果我使用 [A-z0-9_\- \.] 而不是 .* 我会收到错误 500。我真的不明白为什么它不会工作。如果回显 $DB 它给了我我想要的东西,以及它在数据库中的含义,我不明白为什么它不会执行该语句。我告诉它 SELECT ALL FROM post WHERE overskrift = Top-7-foods-for-web-designers ;在我的数据库中,我有一个表,其中有一个名为 overskrift 的列,其中一行包含此文本 Top-7-foods-for-web-designers
  • 成功了!当然,我会在发布之前对其进行参数化。但是该死的!我没看到!非常感谢! :) 当我获得 15 名声望时,我会给你打分!
  • 很高兴你把它整理好了。有时很容易忽略一些简单的事情。
猜你喜欢
  • 2018-07-21
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
相关资源
最近更新 更多