2016-04-21 1 views
0

よりクリーンなURLパスを実装した後、mySQLデータベースからデータを取得する際にsomに問題があります。.htaccessファイルが正しいかどうかわかりません。また、いくつかの問題を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"]) .'"> 

この$行からのフェッチはスムーズに進んでいます。

問題は、私はその後、$ _GET IDに持っている場合、それはproperbly次のステップをフェッチしませんように、それは次のとおりです。

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

エラーが最後の行に表示され、私は苦労していますこれは約3時間後ですが、何か間違っている部分は本当に見つかりません!

Fatal error: Call to a member function fetch_assoc() on a non-object in /var/www/web/xxxxxxx/xxxxx.com/index.php on line 198

私は誰かが役立つことを願って: しかし私は、私は記事を入力しようとしています。このエラーを取得し、私のフロントページの記事のリンクをクリックすることができます。

+0

クエリが失敗しました。 '$ id'とは何ですか?クエリを作成する方法によって、SQLインジェクションが可能になります。準備されたステートメントを使用する必要があります。 – chris85

+0

$ idは.htaccessファイルのid = $ 1に設定されています。それは(。*)です。そして私のhrefでは、$ row ["overskrift"]に設定しました Overskrift =ヘッドライン(デンマーク語) 私の考えは$ idがデータベースのヘッドラインになるということです。 次に、$ idはmySQL文の見出しと等しくなければならないと言います。しかし、それは動作していないようです –

答えて

1

書き換えルールの試合に/大手追加:代わりに.*

のより限定的な文字セット( [A-z0-9_\- \.]など)を使用し、それを望まないなら、これは、 www.example.com/index.php?id=headline/something/elsewww.example.com/article/headline/something/else/を書き換えるということ

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

は注意を

SQLに関しては、などを使用して、要求変数から来るものをパラメータ化することをお勧めします。また、それらを使用する前に変数にいくつかの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のparamterizationは自動的にこれになります)。あなたのSQL行は、次のようになります。

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

しかし、真剣にこのことをしないでください。パラメータ化する!

+0

あなたが言っているように私はRewriteRule場合、それは404と言います。 私は[A - z0-9 _ \ - \。]の代わりに。*私はエラー500を取得します。 私は本当に理解していないなぜそれが働かないのか。 $ DBをエコーアウトすれば、私が欲しいものが私に与えられます。そして、それはデータベース内のものと同じです。なぜ文が実行されないのか分かりません。 私はどこからでも選択してください。overskrift =ウェブデザイナーのためのトップ7の食べ物。 私のデータベースには、このテキストがある行を持つoverskriftという列のテーブルがあります。トップ7食べ物のWebデザイナー –

+0

IT WORKED! 私はそれをリリースする前にそれをパラメータ化します。しかし、神よ!私はそれを見ませんでした!どうもありがとうございました! :)確かに私は15評判を得るとき私はあなたを評価します! –

+0

あなたがそれを並べ替えて嬉しいです。簡単なことを時々見落とすのは簡単です。 – Wilkenism

関連する問題