webForumDet fria alternativet

Ta bort filer? (ftp) Signatur? (forum)

PHP

18 svar · 364 visningar · startad av Kenchu

Medlem sedan apr. 2004113 inlägg
Frågan#1

Tjo!

Problem 1

Right, håller på med ett litet forum, har gjort några FTP-skript, så att man kan ladda upp tex en avatar till en server. Men jag vill ju även att användaren skall kunna ta bort sin avatar för att kunna ersätta den med en annan. (Istället för att ladda upp ännu en bild och ta upp ännu mer plats.)

Problem 2

Jag hade tänkt ha en signaturfunktion på forumet. Först hade jag tänkt mig att signaturen lades in i varje post, men tänkte sedan att det kanske vore bättre om man helt enkelt frågade databasen efter användarnas signaturer varje gång man besökte ett inlägg. Dock, jag vet inte hur jag skall läsa detta på ett bra sätt. Om jag skulle ha gjort något sådant där, skulle det se ut såhär:

$result = mysql_query ("SELECT blah blah FROM blah blah LIMIT blah blah");

while ($line = mysql_fetch_array($result)) {
echo  blah blah $line["name"] blah blah $line["date"] blah blah $line["text"];

$result2 = mysql_query("SELECT signatur FROM members WHERE members = '{$line["name"]}'");

while ($line2 = mysql_fetch_array($result2)) {
echo $line2["signatur"];
}

// Måste man göra en while-sats varje gång man vill skriva ut något?

}

Som ni ser har jag en mysql-sats i varje inlägg - något man kanske helst vill undvika. Kan man göra åstadkomma samma sak fast på annat sätt, att signaturen ritas ut utan att man lägger in den tillsammans med varje post?

Tackasam för svar.

Hoppas ni har en skön sommar förresten! :)

Medlem sedan juli 20033 147 inlägg
#2

Problem 1

Du kan använda dig av funktionen unlink()

Problem 2

$result = mysql_query ("SELECT blah blah FROM blah blah LIMIT blah blah");

while ($line = mysql_fetch_array($result)) {
echo  blah blah $line["name"] blah blah $line["date"] blah blah $line["text"];

$result2 = mysql_query("SELECT signatur FROM members WHERE members = '{$line["name"]}'");
$line2 = mysql_fetch_array($result2);

echo $line2["signatur"];

// Måste man göra en while-sats varje gång man vill skriva ut något?

}

Ett tips är dock att spara användarID:et i databasen istället för namnet och sedan jämföra WHERE userID = $line[userID], då blir det automatiskt unikt.

Medlem sedan apr. 2004113 inlägg
#3

Melea,
tack för ditt svar! Dock, fortfarande är det en MYSQL-sats i varje inlägg. Det blir så slött! Kan man inte på något sätt välja alla signaturer i en endaste en MYSQL-Sats, och sedan rita ut dem tillsammans med rätt användare?

Medlem sedan aug. 20002 975 inlägg
#4

Du kan använda en JOIN, t.ex:

SELECT b.date, b.text, m.members
FROM blah b
INNER JOIN members m ON b.name = m.members
LIMIT 0,10

Sedan måste jag hålla med melea om att du bör använda id från members-tabellen för att relatera användaren till blah-tabellen istället.

Medlem sedan juli 20033 147 inlägg
#5

Självklart ska du använda join. :)
Men vore det inte bättre att använda left-join? Jag menar, _om_ användarID:et av någon anledning inte sparades i databasen så skrivs ju inte någonting alls ut.

SELECT b.date, b.text, m.members
FROM b
LEFT JOIN m
ON b.name = m.members
LIMIT 0,10
Medlem sedan aug. 20002 975 inlägg
#6

Jag förutsätter att man måste vara inloggad för att skriva i forumet, och då sparas användarid ner. Finns inte användarid ska det heller inte gå att spara i forumet.
Därav INNER JOIN.

Medlem sedan juli 20033 147 inlägg
#7

Jo, jag tänkte bara att om man skriver en lång artikel så hinner t.ex. den session som har sparat användarID:et försvinna.
Men visst, det blir ju samma resultat. :)

Medlem sedan aug. 20002 975 inlägg
#8

Finns inte sessionen ska koden vara sådan att det heller inte går att spara :)

Medlem sedan juli 20033 147 inlägg
#9

Om sessionen inte innehåller något värde och man har typen INT i databasen, blir det då inte automatiskt 0 :q

Medlem sedan aug. 20002 975 inlägg
#10

Om man har krav på att man måste vara inloggad för att kunna spara, bör man ha en inloggningskontroll innan man kör koden som sparar till databasen.
Har man då ingen sessionsvariabel ska koden som sparar till databasen överhuvudtaget inte köras.
Problemet ska med andra ord aldrig uppkomma.

Medlem sedan juli 20033 147 inlägg
#11

Aha, du tänker så! :)
Jag brukar av vana bara köra inloggningskontroll på den sidan som formuläret är på.

Medlem sedan aug. 20002 975 inlägg
#12

Så tänker jag :)

För min del är det helt självklart att lägga inloggningskontroll före man kör kod som kräver att man är inloggad.

Medlem sedan juli 20033 147 inlägg
#13

Jo, jag ska tänka på det i fortsättningen. :)

Medlem sedan apr. 2004113 inlägg
#14

Wo, JOIN, något nytt för mig. O_o Får läsa på det. Återkommer...

Tack för alla era svar!

Medlem sedan apr. 2004113 inlägg
#15

Okay, har läst lite på mysql.com om JOIN, och jag fattar absolut ingenting. Eller jovisst, man fattar väl ett och annat, men det hela är alldeles för oklart för att jag skall kunna använda det. Finns det ingen sida som förklarar JOIN på ett utförligt och förståligt sätt?

Medlem sedan aug. 20002 975 inlägg
#16

Vet inte om det här kan vara till hjälp: http://sqlcourse2.com/joins.html

Medlem sedan juli 20033 147 inlägg
#17

Eller http://www.w3schools.com/sql/sql_join.asp :p ;)

Medlem sedan apr. 2004113 inlägg
#18

Tänkte bara visa hur det gick. :) (Fungerade på första försöket O_o.)


<?php

include "functions.php";

open(dfa);

$result = mysql_query("
		SELECT forum.text, forum.wid, forum.tid, forum.date, forum.mid, members.mid, members.name, members.sign
		FROM forum
		INNER JOIN members
		ON forum.mid = members.mid
		WHERE forum.tid = '{$_GET["tid"]}' OR forum.wid = '{$_GET["tid"]}'");
		
while ($row = mysql_fetch_array($result)) {
	echo $row["name"]. " ". normalize($row["date"]). " ". $row["text"];
}

free($result);
close($connection);

?>

// functions.php

<?php

function normalize($date) {
	$date = date("y/m/d D H:i", strtotime($date));
	
	return $date;
}

//***************************************************
//***************************************************

function open($db) {
	$connection = mysql_connect("localhost", "", "");
	if($connection) {
		mysql_select_db($db);
	}
	return $connection;
}

//***************************************************
//***************************************************

function close($connection) {
	if($connection) {
		mysql_close($connection);
	}
}

//***************************************************
//***************************************************

function free($result) {
	if ($result) {
		mysql_free_result($result);
	}
}

?>
Medlem sedan aug. 20002 975 inlägg
#19

Du har dubbla mid i din SQL-fråga. Du måste sätta ett alias på det ena typ

... forum.mid AS fmid, members.mid AS mmid, ...

Du använder förresten inte wid, tid, mid eller sign, och då finns det inte heller någon anledning att ha med dom i SQL-frågan.
Men troligtvis är det så att du ska använda dom, men förenklade ditt exempel lite.

313 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
153 ms — deklarationer (db)
0 ms — hämta statistik (cache)
157 ms — hämta tråd, inlägg och bilagor (db)
151 ms — ändringar (db)