0

datamapper ORM で codeigniter を使用していますが、今日、奇妙なエラーに気付きました。

アイテムページからリンクするカテゴリという名前の関数があります。カテゴリへの url は、カテゴリの名前を使用して形成され、rawurlencode を使用してエンコードされます。

カテゴリ メソッドでは、この URL 文字列をデコードし、get_by_name を使用してカテゴリを見つけます。カテゴリの名前に括弧が含まれている場合を除いて、これはうまく機能します

カテゴリ「アルファベット (英語)」に属するアイテム「ABCDEFGHI」があるとします。rawurlencode を実行した後のカテゴリは文字列 "Alphabets%20%28English%29" を与え、rawurkdecode を実行すると期待どおり "Alphabets (English)" に戻ります。

<?php
$a = "Alphabets (English)";
$b = rawurlencode("Alphabets (English)");
$c = rawurldecode($b);
echo ($a == $c); //returns 1
?>

したがって、$a と $c が等しいことがわかります。「アルファベット(英語)」という正確な文字列値を置き換えることで、以下の方法をテストしましたが、機能しますが、rawurldecodeを使用すると機能しません。

それでも、次のメソッドは 404 ページを nil 返します。

function categories($url = '',$page = 1){
    $url = rawurldecode($url);
  //echo $url;
  //I tried echo here and it gives "Alphabets (English)"
    $cat = new Category();
    $cat->get_by_name($url);
  // replacing $url with the string output from echo $url 
  //in above call works. what is happening here?
  // $cat->get_by_name("Alphabets (English)"); works but 
  // $cat->get-by_name($url); doesn't
    if(empty($cat->id)){
        show_404();
    }
    else{
      // work to do//
    }
}

このアプローチを使用すべきではなかったことはわかっています。カテゴリの名前にタイトルを付けて、テーブルに追加のフィールドを作成する必要がありました。しかし、今はリンクを壊したくありません。

私の問題を理解していただければ幸いです。手がかりを教えてください。問題を理解するのを手伝ってください。

ありがとう!

編集済み

私はrawurlencodeのマニュアルを読みました、誰かがこのページで言ったhttp://php.net/manual/pt_BR/function.rawurlencode.php

一部の文字は現在「予約済み」ですが、代わりに「安全でない」と見なされるべきであることに注意してください。これには、URL が MIME ヘッダーで使用される場合に明らかに安全でない括弧「()」が含まれます。

このため、有効な URL に「()」文字が含まれている場合は、上位レベルのエンコーディングを使用して、上位レベルのプロトコルで定義された「安全でない」文字のペアで URL を囲む必要があります (たとえば、「<> " これらの文字は有効な URL の一部ではないため、MIME ヘッダーのペア)...

codeigniter または datamapper またはその両方がこれらの括弧文字を許可していないと思います。解決策が見つかった場合は、助けてください。codeigniter config で許可された uri 文字に括弧を追加しようとしましたが、まだ運がありません。

4

1 に答える 1

0
if(empty($genre->id))

$genre とは何ですか? $cat->get_by_name($url) の戻り値を $genre に設定するのを忘れましたか?

于 2013-01-22T19:24:21.647 に答える