Benim projelerinden biri olan bir gerginliği biraz isabet ettik. Inekle bir sürü gibi, benim kendi video oyun inceleme sitesi yaratmaya karar verdi. Yorum veritabanında saklanır, ve benzeri bir url ile oyunun başlığı aracılığıyla alınabilir:
http://www.example.com/reviews/ {GameName} / {optional pageOfReview}
Kenar durumlarda test ne yazık ki, ben bir garip hata geldi - oyun başlığı ile bir süre varsa bunu alamaz. Dönemi başlığı (gibi. Hack) önde gelen karakter ise, bana gözden (ya da, daha doğrusu, oyun) yok söylüyorum Kohana yığın izleme hata ekranı olsun. Bu orta veya başlığın sonunda ise, ben yorum (oyun) alınamadı söyleyerek benim kendi hata iletilerinden birini alabilirsiniz. Bu etrafında herhangi bir yolu var mı? Bu MySQL bir süre, ya da başka bir şey ayrıştırır nasıl bir konudur?
EDIT: Tüm sorgular MySQLi sürücüsünü kullanarak Kohana 2'nin ORM işlevselliği aracılığıyla işlenir. Bir inceleme (yönetici kontrolör) Kaydetme:
public function saveReview()
{
$this->checkAdmin();
if (isset($_POST['submit'])) { $this->storeReview(); }
else { header('Location: /admin'); }
}
private function storeReview($id = null)
{
if (!preg_match("/^[a-zA-Z0-9\-_:!'. ]*$/", $_POST['gameTitle']) || empty($_POST['gameTitle'])) { $gameTitle = false; }
else { $gameTitle = ucwords($this->clean($_POST['gameTitle'])); }
if (!is_numeric($_POST['genre'])) { $genre = false; }
else { $genre = $_POST['genre']; }
$platformCheckArray = array_map('is_numeric', $_POST['platforms']);
$platformCheck = true;
foreach ($platformCheckArray as $pca)
{
if (!$pca)
{
$platformCheck = false;
break;
}
}
$proCheck = true;
$cleanedPros = array();
foreach ($_POST['pros'] as $pro)
{
if (!preg_match("/^[a-zA-Z0-9\-_:!' ]*$/", $pro))
{
$proCheck = false;
break;
}
if (!empty($pro)) { $cleanedPros[] = $this->clean($pro); }
}
$conCheck = true;
$cleanedCons = array();
foreach ($_POST['cons'] as $con)
{
if (!preg_match("/^[a-zA-Z0-9\-_:!' ]*$/", $con))
{
$conCheck = false;
break;
}
if (!empty($con)) { $cleanedCons[] = $this->clean($con); }
}
if (!is_numeric($_POST['score'])) { $score = false; }
else { $score = $_POST['score']; }
if (empty($_POST['content'])) { $content = false; }
else { $content = true; }
// save review if all tests pass, display error otherwise
if ($gameTitle && $genre && $platformCheck && $proCheck && $conCheck && $score && $content)
{
$gameTitle = $gameTitle;
$platforms = $_POST['platforms'];
$reviewContent = $_POST['content'];
$prosText = implode(', ', $cleanedPros);
$consText = implode(', ', $cleanedCons);
$game = ORM::factory('game');
$game->title = $gameTitle;
$game->genre_id = $genre;
$game->platforms = $platforms;
$game->save();
$storedGenre = ORM::factory('genre')->where('id', $genre)->find();
$storedGenre->platforms = $platforms;
$storedGenre->save();
$review = ORM::factory('review', $id);
$review->content = $reviewContent;
$review->score = $score;
$review->game_id = $game->id;
$review->date_added = date('Y-m-d H:i:s');
$review->platforms = $platforms;
$review->save();
$pros = ORM::factory('pro');
$pros->review_id = $review->id;
$pros->text = $prosText;
$pros->save();
$cons = ORM::factory('con');
$cons->review_id = $review->id;
$cons->text = $consText;
$cons->save();
if ($game->saved && $storedGenre->saved && $review->saved && $pros->saved && $cons->saved) { $this->success('review'); }
else { $this->showError("Something went wrong with saving the review. Please try again."); }
}
else { $this->showError("All fields must contain values. Please try again."); }
}
(Yorum denetleyicisi) bir inceleme alınıyor:
public function show($id, $page = 1)
{
if (is_numeric($id)) { $game = ORM::factory('game', $id); }
else
{
$id = ucwords(stripslashes($id));
$game = ORM::factory('game')->where('title', $id)->find();
}
if ($game->loaded) { $this->showReview($game->id, $page); }
else { HandiError::factory('Could not retrieve the specified review. Please check that you entered the correct value.'); }
}
private function showReview($id, $page = 1)
{
$page = (int)$page;
if ($page < 1) { $page = 1; }
if ($id)
{
$game = ORM::factory('game', $id);
$review = ORM::factory('review')->where('game_id', $game->id)->find();
$genre = ORM::factory('genre')->where('id', $game->genre_id)->find();
$revPlatforms = $this->db->query("SELECT * FROM platforms
INNER JOIN platforms_reviews AS pr ON platforms.id = pr.platform_id
INNER JOIN reviews ON pr.review_id = reviews.id
WHERE reviews.id = ?", $review->id);
$revPros = ORM::factory('pro')->where('review_id', $review->id)->find();
$revCons = ORM::factory('con')->where('review_id', $review->id)->find();
$platforms = array();
foreach($revPlatforms as $rp) { $platforms[] = $rp->name; }
$pros = explode(', ', $revPros->text);
$cons = explode(', ', $revCons->text);
$pages = explode('<split />', $review->content);
$count = count($pages);
if ($page > ($count)) { $content = $pages[0]; }
else { $content = $pages[$page - 1]; }
$view = new View('reviews/show_review');
$view->content = $content;
$view->gameTitle = $game->title;
$view->genre = $genre->name;
$view->platforms = implode(', ', $platforms);
$view->pros = $pros;
$view->cons = $cons;
$view->score = $review->score;
$view->pages = $pages;
$view->render(true);
}
else { HandiError::factory('Could not retrieve the specified review. Please check that you entered the correct value.'); }
}
EDIT 2: Peki, ben lider dönemi olayıyla ilgili bir şey öğrendim:
Benim denetleyicisinin endeksinde, ben temelde bir yoksul adamın wiki bulunuyor oyun başlığı, platformu, tür, vb değerlendirmeleri listelemek için kullanabileceğiniz bir kaç sorguları var. Bkz:
public function index()
{
/* show a wiki-like page with reviews listed by title,
* game title, genre, and platform
*/
$numGenres = $this->db->query("SELECT COUNT(id) AS num FROM genres");
$numPlatforms = $this->db->query("SELECT COUNT(id) AS num FROM platforms");
$genreCount = $numGenres[0]->num;
$platformCount = $numPlatforms[0]->num;
$scoreCount = 5;
$genreResults = array();
$platformResults = array();
$scoreResults = array();
$gameResults = $this->db->query("SELECT LEFT(title, 1) AS letter, COUNT(id) AS count FROM games GROUP BY letter ORDER BY letter ASC");
for($i = 1; $i < ($genreCount + 1); ++$i)
{
$genreResults[] = $this->db->query("SELECT genres.id AS id, genres.name AS name, COUNT(reviews.id) AS num FROM reviews
INNER JOIN games ON reviews.game_id = games.id
INNER JOIN genres ON games.genre_id = genres.id
WHERE genres.id = ?", $i);
}
for($j = 1; $j < ($platformCount + 1); ++$j)
{
$platformResults[] = $this->db->query("SELECT platforms.id AS id, platforms.name AS name, COUNT(reviews.id) AS num FROM reviews
INNER JOIN platforms_reviews AS pr ON reviews.id = pr.review_id
INNER JOIN platforms ON pr.platform_id = platforms.id
WHERE platforms.id = ?", $j);
}
for($k = 1; $k < ($scoreCount + 1); ++$k)
{
$scoreResults[] = $this->db->query("SELECT score, COUNT(id) AS num FROM reviews WHERE score = ?", $k);
}
$view = new View('reviews/index');
$view->gamesByLetter = $gameResults;
$view->genres = $genreResults;
$view->platforms = $platformResults;
$view->scores = $scoreResults;
$view->render(true);
}
Ben içlerinden görünümüne bu sorgu sonuçlarını, ben döngü geçmek ve meta kategorisine göre bağlantıları oluşturduğunuzda. Yani, vb harfi A, B, ile başlayan kaç oyun gösterir ve bu bağlantılardan birine tıklayarak () diğerleri arasında bir bağlantı listesi, bir inceleme (Yani, A-> Afterburner ile her birine kullanıcı getiriyor -> Afterburner için yorum).
Ben fare lider dönemi vardır grup üzerinde, benim durum çubuğu dönemi, kaynağında gösterir olsa bile, bağlantı eksik olduğunu gösterdiğinde. Yani, kaynak site.com / yorum / oyun / gibi bağlantı gösterir bile. tarayıcı site.com / yorum / oyun / Bu bana süre bile yönteme geçirilen olmadığına inanıyorum yapar gibi gösterir, ve yığın izlemesi dönem olacaktır eksik bir argüman var, iddia (onaylamak gibi görünüyor .)
3 EDIT: Tamam, ben yolları bir göz attım, ve orada bir şey bulamıyorum. O dedi, ben SEO için güzel bakmak yolları mod_rewrites bir. Htaccess dosyası var, yani bu sorun olabilir, merak ediyorum. Kohana forumlarında insanlar bana verdi, ve o amele, bu yüzden onunla gitti - Ben bir mod_rewrite dosya kendimi hiç yazmamış. Ben dahil RegEx'in bazı anlayabiliyorum, ama benim regEx Fu zayıftır. Ben son satırı 'sihirli' yok inanıyorum.
# Turn on URL rewriting
Options +FollowSymlinks
RewriteEngine On
# Put your installation directory here:
# If your URL is www.example.com/, use /
# If your URL is www.example.com/kohana/, use /kohana/
RewriteBase /
# Do not enable rewriting for files or directories that exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# For reuests that are not actual files or directories,
# Rewrite to index.php/URL
# Original rule:
# RewriteRule ^(.*)$ index.php/$1 [PT,L]
# Alternative rule:
# RewriteRule .* index.php/$0 [PT,L]
# 2nd alternative rule that works on ICDSoft:
RewriteRule .* index.php?kohana_uri=$0 [PT,QSA,L]
Ben bu hakkı, '.' Okuyorsam sadece herhangi bir tek karakter anlamına gelir.
Can '.' kenara bir dosya uzantısı veya web eki (. com,. org vb) gösterir yerden iyi oluşturulmuş URL kullanılabilir? Ben bana bir tarayıcı / iyi biçimlilik sorunu değil, bir kodlama biri inanmak için neden onlarla bir bağlantı üzerine geldiğinizde Yani, Firefox'un durum çubuğunda görünmüyor.