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 文字に括弧を追加しようとしましたが、まだ運がありません。