Just nu i M3-nätverket
Jump to content

Tillvägagångssätt - Sökfunktion - Med mera!


Rob Blake

Recommended Posts

search.php

<?php

//get data
// här måste du kontrollera att $_GET['submit'] existerar först
if (isset($_GET['submit'])) $button = $_GET['submit'];

// använd hakparantes för $_GET['search'] (detta då $_GET är en array)
$search = $_GET['search'];


//kollar med funktionen isset() om $button inte finns
if (!isset($button)) echo "Du måste ange ett sökord!";
else
// använd "måsvingar" för kod-block
{
		if (strlen($search)<=2) echo "Sökningen är för kort."; //missat ;
	else
       // använd "måsvingar"
		{
    		echo "Du sökte efter <b>$search</b><hr size='1'>";
		}
}

?>

 

Redigerat koden. Markerat med kommentering vad, förutom if-satser som endast kör en grej. De drog jag bara upp så de ligger på en rad:

 

if (villkor == vilkor) echo 'Skrivet på en rad';

// istället för

if (villkor == villkor)
   echo 'Skrivet på två rader';

Link to comment
Share on other sites

Tror jag fixade det mesta, men är fortfarande något fel! Här kommer koden igen, har lagt till lite men måste missat nåt någonstans!

 

<?php

//get data
if (isset($_GET['submit'])) $button = $_GET['submit'];
$search = $_GET['search'];

if (!isset($button)) echo "Du måste ange ett sökord!";
else
//
{
	if (strlen($search)<=2) echo "Sökningen är för kort.";
	else
//
	{
	 	echo "Du sökte efter <b>$search</b><hr size='1'>";

		//connect to database
		mysql_connect("phpmyadmin.*********.net","********","*********");
		mysql_select_db("tankafilm_net");

		$_GET = mysql_query("SELECT * FROM searchengine");
		while ($getrow = mysql_fetch_assoc($get))
		{

				//explode search term
				$search_exploded = explode(" ",$search);

				foreach($search_exploded as $search_each)
				{

				}



		}

	}
}

?>

 

Naturligtvis censorerade jag användarnamnet och lösenordet. Såhär ser det ut när jag försöker göra en sökning! Denna kod ska ju naturligtvis inte visas, dock förstår jag inte vad jag har gjort fel!

 

[log]$search"; //connect to database mysql_connect("phpmyadmin.*********","**********.net","******"); mysql_select_db("tankafilm_net"); $_GET = mysql_query("SELECT * FROM searchengine"); while ($getrow = mysql_fetch_assoc($get)) { //explode search term $search_exploded = explode(" ",$search); foreach($search_exploded as $search_each) { } } } } ?>[/log]

Link to comment
Share on other sites

$_GET är ett reserverat namn, det måste ändras. Vidare har jag ingen större koll på eplode() funktionen, men det händer inget i foreach blocket. Så koden kan funka, men du ser inget eftersom ingenting printar ut något.

 


<?php

//get data
if (isset($_GET['submit'])) $button = $_GET['submit'];
$search = $_GET['search'];

if (!isset($button)) echo "Du måste ange ett sökord!";
else
{
if (strlen($search)<=2) echo "Sökningen är för kort.";
   else
   {
   	echo "Du sökte efter <b>$search</b><hr size='1'>";

       //connect to database
       mysql_connect("phpmyadmin.*********.net","********","*********");
       mysql_select_db("tankafilm_net");

// Här hade du $_GET - inte tillåtet variabel namn!
       $get = mysql_query("SELECT * FROM searchengine");
       while ($getrow = mysql_fetch_assoc($get))
       {
// här fanns ett foreach block som inte gjorde något. Byttes ut.
		echo $getrow['title'];
	}

}
}

?>

 

Link to comment
Share on other sites

Började om från början för förstod verkligen inte vad jag gjorde för fel!

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>search</title>
</head>
<body>
<?php

//get data
$button = $_GET['submit'];
$search = $_GET['search'];

if (!$button)) 
echo "Du måste ange ett sökord!";
else
{
if (strlen($search)<=2)
	echo "Sök ordet är för kort!";
else
{
	echo "Du sökte efter <b>$search</b><hr size='1'>";

	//connect to database
	mysql_connect("**********","**********","********");
	mysql_select_db("**********");

	$get = mysql_query("SELECT * FROM searchengine");
	while ($getrow = mysql_fetch_assoc($get))
	{
		$keywords = $getrow['keywords'];

		echo $keywords."<br>";
	}
}
}

?>
</body>
</html>

 

Du får gärna besöka hemsidan så ser du vad som händer när man försöker göra en sökning!

[borttagen länk]

 

Jag ber om ursäkt om du har försökt påpeka något och jag möjligtvis har gjort det fel igen, men försök att ha tålmodighet med mig! Första gången jag sitter och skriver php-kod!

Link to comment
Share on other sites

Parse error: syntax error, unexpected ')' in /customers/tankafilm.net/tankafilm.net/httpd.www/search.php on line 14

 

if (!$button)) << Två parantesslut.

 

 

 

Sedan tycker jag inte är så klyftigt att visa att du håller på att producera en webbplats där man uppmuntrar brott mot upphovsrätten.

 

Därför tar jag bort länken.

Link to comment
Share on other sites

(Sidan är synlig från felmeddelandet).

 

Du kommer få en fungerande sökfunktion (dock lite buggig och osäkrad (google: php mysql-injections)) om du fixar det som Jonas_B skrev. Jag kan hjälpa dig lösa detta problem, då jag vet hur frustrerande det är med enstaka fel. Men utöver det tar jag avstånd från problem rörande denna sida.

 

Hoppas du förstår blush.gif

Link to comment
Share on other sites

Såhär ser min färdiga kod ut! Och den verkar fungera just nu iaf, säg gärna till om det finns något jag kan förbättra :)

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>search</title>
</head>
<body>
<?php

//get data
$button = $_GET['submit'];
$search = $_GET['search'];

if (!$button) 
echo "Du måste ange ett sökord!";
else
{
if (strlen($search)<=2)
	echo "Sökordet är för kort!";
else
{
	echo "Du sökte efter <b>$search</b><hr size='1'>";

	//connect to database
	mysql_connect("tankafilm.net.mysql","tankafilm_net","solopolo");
	mysql_select_db("tankafilm_net");


		//explode search term
		$search_exploded = explode(" ",$search);

		foreach($search_exploded as $search_each)
		{

			//construct query
			$x++;
			if ($x==1)
				$construct .= "keywords LIKE '%$search_each%'";
			else
				$construct .= " OR keywords LIKE '%$search_each%'";

	}

//echo out construct

$construct = "SELECT * FROM searchengine WHERE $construct";
$run = mysql_query($construct);

$foundnum = mysql_num_rows($run);

if ($foundnum==0)
	echo "Inga sökresultat funna!";
else
{
	echo "$foundnum Sökresultat funna!<p>";

	while ($runrows = mysql_fetch_assoc($run))
	{
		//get data
		$title = $runrows['title'];
		$desc = $runrows['description'];
		$url = $runrows['url'];

		echo "<b>$title</b><br>
		$desc<br>
		<a href='$url'>$url</a><p>
		";

	}
	}

}

}

?>
</body>
</html>

 

Ber om ursäkt, visste inte att man inte fick länka till sin egen hemsida.

Tror ni har missuppfattade själva ideén med hemsidan. Jag kommer absolut inte lägga upp något som bryter mot upphovsrättslagen. Det enda jag gör är att länka vidare för att tipsa kompisarna om passande filmer. Sen vad de gör med tipsen kan jag tyvärr inte svara för.

 

Men eftersom att sökfunktionen nu verkar funka så har jag en fundering. Om jag vill att själva sökresultaten inte ska komma upp på en ny sida, utan att den ska dyka upp under själva huvudbannern på sidan. Hur går jag tillväga då?

Jag förstår inte heller hur man skapar id nummer på filmerna, så att om jag söker på en viss film så vill jag inte att jag måste skapa en helt ny .html sidan, utan att den ska visas över själva listan på sidan filmer. Hoppas ni förstår vad jag menar!

 

Är väldigt tacksam för all er hjälp än så länge! :)

Link to comment
Share on other sites

om det bara en filmtips/recensionssida är det ok att länka. När jag kollade på den snabbt fick jag uppfattningen att det hade med filmtorrents att göra (eller länkning till annan part som tillhandahåller torrents).

Om så inte är fallet nu eller i fortsättningen så är det ok att lägga in länken igen. :)

 

Börja med det nuvarande sökresultatet så länge och fortsätt att färdigställa hemsidan så kan man lägga på en resultatlistning med ajax senare, är mitt tips.

Link to comment
Share on other sites

 

 

Börja med det nuvarande sökresultatet så länge och fortsätt att färdigställa hemsidan så kan man lägga på en resultatlistning med ajax senare, är mitt tips.

 

Jo men iom att jag vill fortsätta lägga upp fler filmtips så vet jag inte hur jag ska gå tillväga då jag inte vill skapa nya html filer för varenda film.

 

Jag hittade denna koden:

<?php 

$x = $HTTP_GET_VARS['x']; 

if (empty($x)) { 
   $x = "home"; 
} 

if ($x == "index") { 
   die("You cannot execute this page"); 
} 

if( file_exists($x . ".php") === TRUE) { 
   include("$x.php"); 
} else { 
   die("Error: $x.php not found."); 
} 
?> 

 

Jag förstår dock inte riktigt var jag ska göra av den?

Link to comment
Share on other sites

Skulle du inte använda dig av en databas?

Då behöver du inte bara en php-sida/mall för att hämta filminfo.

 

Din kod du visar bygger på att man lägger all innehåll i en sida: index.php

anropar man index.php?x=film så letar scriptet efter en annan fil som heter film.php som den lägger till till index.php.

 

Jag tycker att index.php skall vara startsidan, film.php skall vara en egen filminnehållssida, sedan ha gärna topp-10.php som visar en lista på de topprankade filmerna.

 

Har du gjort klart alla html-mallarna så att länkar fungerar fram och tillbaka kan du börja med att lägga till alla filmdata i en databas.

 

När du gjort detta, testa om kopplingen mot databasen fungerar.

Sedan gör du en filmsidemall, baserat på en statisk filminfosida du redan har, men döp den till .php och lägg in kopplingen till databasen.

Förhoppningsvis har du en ID-nyckel i databasen så du kan hämta enskild filmdata genom att skicka med en variabel i filnamnet (e g film.php?id=123).

I mallen hämtar du upp denna

<?php
if (!isset($_GET['id'] )) die("inget id är satt");

$x = $_GET['id']; 
//databaskoppling & hämta filmdata

?>

 

Mycket hjälp med variablar och databas hittar du på http://www.w3schools.com/php/default.asp

Link to comment
Share on other sites

Ärligt talat: Vem har gjort mallen?

 

Denna kod för ett göra EN box med en lista som innehåll?

<div class="col-1 maxheight" style="height: 550px; ">
           	<!-- box begin -->
              <div class="box maxheight" style="height: 550px; ">
                 <div class="border-top maxheight" style="height: 550px; ">
                    <div class="border-right maxheight" style="height: 550px; ">
                       <div class="border-bot maxheight" style="height: 550px; ">
                          <div class="border-left maxheight" style="height: 550px; ">
                             <div class="left-top-corner maxheight" style="height: 550px; ">
                                <div class="right-top-corner maxheight" style="height: 550px; ">
                                   <div class="right-bot-corner maxheight" style="height: 550px; ">
                                     <div class="left-bot-corner maxheight" style="height: 550px; ">
                                       <div class="inner">
                              <h2>Populära filmer just nu</h2>
                                           <ul class="list1">
                                             <p>Film 1</p>
                                             <p>Film 2</p>
                                             <p>Film 3</p>
                                             <p>Film 4</p>                                              
                                          </ul>
                                       </div>
                                      </div>
                                   </div>
                                </div>
                             </div>
                          </div>
                       </div>
                    </div>
                 </div>
              </div>
              <!-- box end -->
           </div>

Sedan skall man ha LI inne i en UL, inte P.

 

Om det är lätt att hantera skall du inte byta men det är väldigt mycket kod för rundade hörn.

 

Samma effekt kan man uppnå med max två div-element, isf åtta.

<div class="col-1 maxheight">
<div class="box">
	<div class="inner">
		<h2>Populära filmer just nu</h2>
		<ul class="list1">
			<li>Film 1</li>
			<li>Film 2</li>
			<li>Film 3</li>
			<li>Film 4</li>                                              
		</ul>
	</div>
</div>
</div>

Css koden blir avsevärt mindre också (dock inte stöd för IE7 och äldre men skit i dem ;)

 

 

Kanske ingen högprioriterad punkt just nu iofs, men ville bara resa frågan.

Link to comment
Share on other sites

Ska prova mig på det där snart! Haha och angående den där koden så har jag försökt klistra ihop från lite olika koder. Får väl ändra det sen så det blir bättre :)

 

Men jag håller på att göra en login-funktion nu. Dock sa har jag något fel, men förstår inte vad.

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<?php

session_start();

$username = $_POST['username'];
$password = $_POST['password'];

if ($username&&password)
{

$connect = mysql_connect("************","*********","*********") or die("Kunde inte logga in!");
mysql_select_db("*********") or die("Kunde inte hitta databas!");

$query = mysql_query("SELECT * FROM users WHERE username='$username'");

$numrows = mysql_num_rows($query);

if ($numrows!=0)
{

while ($row = mysql_fetch_assoc($query))
{
		$dbusername = $row['username'];
		$dbpassword = $row['password'];
}

//check if they match
if ($username==$dbusername&&$password==$dbpassword)
{
	echo "Du är nu inloggad! <a href='member.php'>Klicka här</a> för att komma till de privata filmerna!";
	$_SESSION['username']==$dbusername;
}
else
	echo "Felaktigt lösenord!";

}
else
die("Användaren existerar inte!");


}
else
die("Var snäll och ange användarnamn och lösenord");

?>

</body>
</html>

 

Felmeddelande: [log]Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /customers/tankafilm.net/tankafilm.net/httpd.www/login.php:10) in /customers/tankafilm.net/tankafilm.net/httpd.www/login.php on line 12

 

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /customers/tankafilm.net/tankafilm.net/httpd.www/login.php:10) in /customers/tankafilm.net/tankafilm.net/httpd.www/login.php on line 12[/log]

Link to comment
Share on other sites

Jag kollade lite på min databas, och jag har lagt in två sökexempel redan! Frågan är om jag ska använda mig av samma "table", i mitt fall: 'searchengine' när jag lägger in alla filmer?

 

Just nu ser mitt table ut såhär:

id title description url keywords

 

ID är satt på auto_increment. Frågan är då vilken länk jag ska använda mig av? Iom att jag vill länka direkt till den själva filmen, inte till själva filmer.php!

 

Eller tycker du kanske det är bättre att jag gör en ny table, exempelvis: filmer? I så fall så måste jag ju lägga in datan två gånger, både i searchengine table och filmer table?

Link to comment
Share on other sites

Att du blandar olika frågor i samma tråd är ingen bra idé.

Läs på lite om hur php-fungerar och sök på internet för att hitta svar på dina frågor innan du postar här. Det mesta finns det redan svar på.

 

För sökningen skall du självklart söka i din filmtabell eller i andra tabeller som innehåller relevant data. Det beror helt på vad du skall kunna söka på.

Filmtitlar är självklart, skådespelare, regissörer, producenter, filmbolag osv.

Ligger allt i samma databastabell eller hur bygger du databasen?

 

Search engine-tabellen är antagligen ett förslag på tabellnamn.

Link to comment
Share on other sites

Håller med Jonas_B här, vad gäller inloggnings funktion är min väldigt starka rekommendation att kolla hur andra gjort. Den funktion du gjort nu är så osäker att den kan ge vem som helst tillgång till användare och deras lösen inom 2-3 minuters testande.

Rent spontant saknas saltning av lösenord men mycket viktigare är krytpering i databasen. Du vill hantera klartext lösenord i absolut minimal utbredning. Finns massa tråkiga hot på internet, XSS (cross site scripting) t ex vilket måste hindras i en inloggning funktion.

 

 

Inte alls lika viktigt just nu, men:

En liten mer avancerad fråga som kanske inte är så rolig just nu är databas design. Kolla wikipedia för normaliserings formel, främst den engelska där det står lite mer utförligt. Om sidan blir stor kommer databasen äta hur mycket tid som helst.

(Tänker på att keywords innehåller mer än ett värde).

Link to comment
Share on other sites

Att du blandar olika frågor i samma tråd är ingen bra idé.

Läs på lite om hur php-fungerar och sök på internet för att hitta svar på dina frågor innan du postar här. Det mesta finns det redan svar på.

 

För sökningen skall du självklart söka i din filmtabell eller i andra tabeller som innehåller relevant data. Det beror helt på vad du skall kunna söka på.

Filmtitlar är självklart, skådespelare, regissörer, producenter, filmbolag osv.

Ligger allt i samma databastabell eller hur bygger du databasen?

 

Search engine-tabellen är antagligen ett förslag på tabellnamn.

 

Okej, då kör vi på denna frågan så länge!

 

Just nu så har jag tre tabeller:

searchengine

spamlist

users

 

I searchengine så har jag som jag sa innan, detta är ett filmexempel!

ID-----TITLE-----DESCRIPTION-----URL----------------------------------KEYWORDS

A_I Case.39 Horror movie http://www.tankafilm.net/filmer.php'>http://www.tankafilm.net/filmer.php Case.39 Case 39

A_I The Final Horror movie http://www.tankafilm.net/filmer.php Final 2010 The.f

 

Ska jag fortsätta att mata in filmer såhär? Och ska jag använda mig av den URL:en eller ska jag använda mig av ID? I så fall hur?

Link to comment
Share on other sites

urlen är ju konstant, skiljt från IDnummer så det behöver inte finnas i databasen, eller hur?!

 

ID skall vara en INT med auto_increment så att tabellen hittar snabbt och lätt och så att det inte blir några dubbletter.

 

Du får bygga din databas hur du vill men för utbyggnadens skulle hade jag personligen byggt databasen så här:

Tabeller

Movies
ID, Title, OrgTitle, Year, Description, Plot, IMDB-rate, Image, RunningTime, Country

MovieCategories
ID, Categoryname

Persons
ID, Name, Birthdate, Description

Roles
ID, RoleName, Priority
Leading Role, Co Actor, Writer, Producer, Director

ProductionCompanies
ID, Name

// korstabeller som länkar ihop tabeller med varandra
Movie__Category
MovieID, MovieCategoryID

Movie__Cast
MovieID, PersonId, RoleId

Movie__AdditionalImages
ID, MovieID, UserID, Date, URL

Movie__ProductionCompany
MovieID, ProductionCompanyID

 

Läs på lite om mysql/databashantering så kommer du förstå varför också.

Link to comment
Share on other sites

Då försökte jag göra som du sa!

 

Såhär ser databasen ut just nu:

 

Tabeller

# Moviecategories
# Movies
# searchengine
# spamlist
# users

Moviecategories: ID INT,(A_I) - Kategorie

Movies: ID INT,(A_) - Titel - År - Handling - IMDBrate - Bild - Längd - Trailer

 

Alltså behöver jag bara en korstabell mellan Movies och Moviecategories? Hur gör jag den?

 

Jag tryckte även insert på Movies för att lägga in lite värden för en exempelfilm.

Såhär skrev jag exakt:

ID:

Titel:IP MAN

År: 2008

Handling: En semi-biografisk berättelse om Wing-chung kung fu-grenens skapare IP Man och hans liv i det japanskockuperade Foshan i Kina.

IMDB-rate: http://www.imdb.com/title/tt1220719/

Bild: http://moviestudio.files.wordpress.com/2009/05/l_1220719_d4d5150f.jpg?w=300&h=431

Längd: 106 minuter

Trailer: http://www.youtube.com/watch?v=959h-GXfeNc

 

Bara så jag har förstått själva grejen. Ska jag trycka 'Insert' på varenda film jag vill lägga in? Och hur bygger jag själva html sidan där de här värdena ska visas?

Link to comment
Share on other sites

Läs på w3schools som vi länkade till hur man hämtar data från databas och lägger in i mallen.

 

Korstabellen ser ut som jag skrev i mitt förra inlägg.

Har du säg följande rader i category:

ID categoryname

1 "Action"

2 "Drama"

3 "Dokumentär"

 

Lägger du in följande i korstabellen "Movie__categories"

MovieID categoryId

1 1 - Filmen med ID 1 är både Action och Drama

1 2 - Filmen med ID 1 är både Action och Drama

2 3 - Filmen med ID 2 är en dokumentär

3 2 - Filmen med ID 3 är en Drama

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...