PHP/MySQL - Hur fixa min gästbok?

Tråden skapades och har fått 15 svar. Det senaste inlägget skrevs .
1

Så här ligger det till.

Jag har gjort något som kan beskrivas lättast som en gästbok i php/mysql. Men det är två saker som jag inte riktigt är nöjd med;

1. Hur får man så att det blir en liten fin länk längst ner om sidan inehåller mer än XX poster? Och hur får man numrerade sidor om det är mer än två?

2. När man lägget till en post så fyller man i ett formulär där själva meddelandet fylls i en <textarea>. Kruxet är att om användaren vill byta rad själv genom att helt sonika trycka på [enter] så behandlas detta som ett mellanslag. Hur åtgärdar jag detta?

Vore oändligt tacksam (nåja, nästan i alla fall...) för svar.

/sny

  • Medlem
  • Stockholm
  • 2003-02-20 21:34

På delfråga nummer 2 säger jag
$message = nl2br($message);

Nummer ett är lite krångligare, och mitt tangentbord halvstrejkar men det kan göras genom att plocka upp antal poster och sen dela det i så många poster per sida och sen skriva ut länkarna med variabler för limit i sql´satsen.

Sök i manualen på next_result (finns en med prefix odbc_ och en med mssql). Därifrån finns lite kodexempel och relaterade ord.

Här är ett exempel:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"><?php
$link = mssql_connect ("localhost", "userid", "secret");
mssql_select_db("MyDB", $link);
$SQL = "Select * from table1 select * from table2";
$rs = mssql_query($SQL, $link);
do {
while ($row = mssql_fetch_row($rs)) {
}
} while (mssql_next_result($rs));
mssql_free_result($rs);
mssql_close ($link);
?> </pre>

Tyvärr kan jag inte hjälpa dig mera, för jag kan inte PHP.

Eftersom jag inte kan låta bli så skriver jag ut hur man skriver i Lasso:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">[Link_NextGroup]Nästa sida --> [/Link_NextGroup] </pre>

Hihi.

(Jo det finns säkert något motsvarande i PHP, men jag hittade det inte när jag gjorde en snabb sökning. )

/Ola

Citat:

citera:Skapades ursprungligen av: Linus:
På delfråga nummer 2 säger jag
$message = nl2br($message);

Nummer ett är lite krångligare, och mitt tangentbord halvstrejkar men det kan göras genom att plocka upp antal poster och sen dela det i så många poster per sida och sen skriva ut länkarna med variabler för limit i sql´satsen.

Fett! Var exakt ska jag stoppa in det här?

(Håll ut jag är nybörjare!)

/sny

  • Medlem
  • Stockholm
  • 2003-02-20 22:54

Vart som helst efter du har hämtat informationen från mysql men innan du skriver ut den till besökaren.
Så har du en while-loop kan du ta ganska direkt efter den.

Exempel:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">$result = "select * from table";
while (list($id,$message) = mysql_fetch_row($result))
{
$message = nl2br($message);
echo "$message
";
} </pre>

Edit: la till exempel.

[ 20. februari 2003, 23:00: Meddelandet ändrat av: Linus ]

  • Medlem
  • Stockholm
  • 2003-02-21 00:02

OK, jag gör ett försök med fråga 1:

Scriptet som visar databasposterna (inläggen i gästboken) måste hålla reda på några saker:

1. Max antal poster per sida.

2. Totalt antal poster. (Detta för att veta hur många sidor som krävs för att visa alla poster.) Fås genom en SQL-fråga av typen SELECT count(*) FROM tabell

3. Aktuellt sidnummer alternativt aktuell sidas första post. Första gången scriptet laddas är det ju lätt. När du sedan länkar till nästa sida måste du använda t ex:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"><a href="script.php?page=2">Nästa</a></pre>

för att scriptet ska veta vad som gäller nästa gång det körs.

Med all den informationen tillgänglig är det bara att köra en SQL-fråga liknande den här:
SELECT * FROM tabell LIMIT $startpost,$antal_poster
Tänk bara på att $startpost ska vara 0 när du vill visa första posten och 10 när du vill visa post nr 11 osv.

Längst ner på sidan får du göra en "smart" bläddrare som håller reda på vilka sidor man kan bläddra till beroende på vilken man står på och hur många det finns.

Vill du har mer handfasta råd än så (kodexempel) så tycker jag du ska kolla efter färdiga exempel på nätet. Det är en ganska vanlig funktion. Lycka till!

Tack så mycket allihop!

Nu ska jag koda hela natten!

/sny

YES!

Nu funkar det. Använde mig av det här isället:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"> $maxposter = mysql_query("SELECT * FROM tabell", $db);

$total = mysql_num_rows($maxposter); </pre>

Det blev nå knas när jag skulle göra på ditt sätt. Hur som så funkar det...

Tack!

/sny

  • Medlem
  • Stockholm
  • 2003-02-21 10:23
Citat:

citera:Skapades ursprungligen av: snyltarn:
Nu funkar det. Använde mig av det här isället:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"> $maxposter = mysql_query("SELECT * FROM tabell", $db);

$total = mysql_num_rows($maxposter); </pre>

Det blev nå knas när jag skulle göra på ditt sätt.

Japp, så kan man göra. Det som inte är riktigt bra med den metoden är att hela tabellen laddas från databasen när det enda du egentligen behöver är antalet poster. Inget riktigt problem i ditt fall, men om man har många poster så blir det onödigt tungt för servern.

count(*) är däremot en SQL-fråga som går väldigt snabbt även med stora databaser.

Såhär skulle det kunna se ut:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">// Skicka databasfrågan
$sql = "SELECT count(*) FROM Tabell";
$antal_poster = mysql_query($sql,$db);

// Hämta resultat - alternativ 1 (snyggast):
list ($antal_poster) = mysql_fetch_row[$antal_poster];

// Hämta resultat - alternativ 2 (samma resultat):
$antal_poster = mysql_fetch_row[$antal_poster];
$antal_poster = $antal_poster[0];</pre>

Varning: har inte testkört, så det kan finnas fel.

Måste man skriva så mycket i PHP för att få en bläddringsstruktur? Finns det inte "system-variabler" i brist på ett bättre ord som vet antal funna poster, hur många som visas på just den här sidan, hur många totalat osv?

/Ola

[ 21. februari 2003, 13:48: Meddelandet ändrat av: Taz_1999 ]

  • Medlem
  • Stockholm
  • 2003-02-21 13:59
Citat:

citera:Skapades ursprungligen av: Taz_1999:
Måste man skriva så mycket i PHP för att få en bläddringsstruktur? Finns det inte "system-variabler" i brist på ett bättre ord som vet antal funna poster, hur många som visas på just den här sidan, hur många totalat osv?

/Ola

Tror inte något sådant existerar i MySQL, utan man får med PHP´s hjälp göra uträkningar själv, vilket medför att just en struktur för att skriva ut länkar till varje enskild sida i en flersidig gästbok är onödigt komplex.

Anledningen att jag frågar är att jag trodde att PHP har samma funktionalitet som Lasso (som jag är en fan av). Lasso har alltså några smidiga funktioner för detta.

Citat:

citera:Tror inte något sådant existerar i MySQL, utan man får med PHP´s hjälp göra uträkningar själv, vilket medför att just en struktur för att skriva ut länkar till varje enskild sida i en flersidig gästbok är onödigt komplex.

Vad jag vet finns samma problematik i ASP också, man får själv bygga upp kod för att göra en bläddrigsstruktur när man gör sökningar i en databas.

Några exempel på hur man gör i Lasso:

En sökning i en MySQL-databas.

Det som står mellan [Records] upprepas en gång för varje funnen post.

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">[Inline: -FindAll,
-Database=´Contacts´,
-Table=´People´,
-KeyField=´ID´]
There are [Found_Count] record(s) in the People table.
[Records]

[Field: ´First_Name´] [Field: ´Last_Name´]
[/Records]
[/Inline] </pre>

Information om sökresultatet:

[Found_Count] Returns the number of records found by Lasso.
[Shown_Count] Returns the number of records shown in the current found set. Less than or equal to [MaxRecords_Value].
[Shown_First] Returns the number of the first record shown from the found set. Usually [SkipRecords_Value] plus one.
[Shown_Last] Returns the number of the last record shown from the found set.
[Total_Records] Returns the total number of records in the current table. Works with FileMaker Pro databases only.

Det ger mig lätt en rad som lyder:
U poster hittade, denna sida visar V poster, nr X till Y, av totalt Z poster i databasen.

Ersätt U med [Found_Count] osv.

Enkla sätt att bygga upp länkar till saker och ting

[Link_CurrentActionURL] Returns a link to the current Lasso action. Optional parameters specify what command tags should be included.
[Link_FirstGroupURL] Returns a link to the first group of records based on the current Lasso action. Sets -SkipRecords to 0.
[Link_PrevGroupURL] Returns a link to the next group of records based on the current Lasso action. Changes -SkipRecords.
[Link_NextGroupURL] Returns a link to the next group of records based on the current Lasso action. Changes -SkipRecords.
[Link_LastGroupURL] Returns a link to the last group of records based on the current Lasso action. Changes -SkipRecords.
[Link_FirstRecordURL] Returns a link to the first record based on the current Lasso action. Sets -MaxRecords to 1 and -SkipRecords to 0.
[Link_PrevRecordURL] Returns a link to the next record based on the current Lasso action. Sets -MaxRecords to 1 and changes -SkipRecords.
[Link_NextRecordURL] Returns a link to the next record based on the current Lasso action. Sets -MaxRecords to 1 and changes -SkipRecords.
[Link_LastRecordURL] Returns a link to the last record based on the current Lasso action. Sets -MaxRecords to 1 and changes -SkipRecords.
[Link_DetailURL] Returns a link to the current record using the primary key and key value. Changes -KeyValue.
[Referrer_URL] Returns a link to the previous page which the visitor was at before the current page. [Referer_URL] is a synonym.

Så här skriver jag för att få en rad som lyder:
|< Första < Föregående | Nästa > och Sista >|

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">[If: (Link_FirstGroupURL) != ´´]<a href="[Link_FirstGroupURL]"> First </a>[/If]
[If: (Link_PrevGroupURL) != ´´]<a href="[Link_PrevGroupURL]"> Previous </a>[/If]
[If: (Link_NextGroupURL) != ´´]<a href="[Link_NextGroupURL]"> Next </a>[/If]
[If: (Link_LastGroupURL) != ´´]<a href="[Link_LastGroupURL]"> Last </a>[if] </pre>

Så här skriver jag för att få en lista på sidnummer med träffar med länkar till sidorna 1 2 3 4 osv...

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">[Variable: ´Count´ = 0]
[While: $Count < (Found_Count)]
<a href="[Link_CurrentActionURL: -SkipRecords=$Count]"> [Loop_Count] </a>
[Variable: ´Count´ = $Count + (MaxRecords_Value)]
[/While]</pre>

Finns inte detta i PHP alltså?

/Ola

[ 21. februari 2003, 16:45: Meddelandet ändrat av: Taz_1999 ]

  • Medlem
  • Stockholm
  • 2003-02-21 17:15

Såg ju smidigt ut det där.
Mig veterligen finns det inget sånt inbyggt, då borde jag stött på det vid det här laget (tror till och med en författare hos O´Reilly har ledsnat på detta och skrivit en php-class för återanvändning).

Citat:

citera:Såg ju smidigt ut det där.

Det är så smidigt så ni PHP-nissar borde bli gröna av avund.

/Ola

Citat:

citera:Skapades ursprungligen av: HL:

Citat:

citera:Skapades ursprungligen av: snyltarn:
Nu funkar det. Använde mig av det här isället:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"> $maxposter = mysql_query("SELECT * FROM tabell", $db);

$total = mysql_num_rows($maxposter); </pre>

Det blev nå knas när jag skulle göra på ditt sätt.

Japp, så kan man göra. Det som inte är riktigt bra med den metoden är att hela tabellen laddas från databasen när det enda du egentligen behöver är antalet poster. Inget riktigt problem i ditt fall, men om man har många poster så blir det onödigt tungt för servern.

SELECT * är generellt en ganska dålig idé. Bättre att specifiera vad som ska hämtas och helst med en LIMIT.

SQL är underbart.

Ciryon (som adminar databaser med 55 000+ entries. )

  • Medlem
  • Stockholm
  • 2003-02-23 01:12
Citat:

citera:Skapades ursprungligen av: Taz_1999:
Det är så smidigt så ni PHP-nissar borde bli gröna av avund.

[OT, men ok.] Ja, Lasso innehåller uppenbarligen färdiga funktioner för att hantera/publicera poster på ett enkelt sätt. Det är kanske en av anledningarna till att man betalar för det... PHPs inbyggda databasfunktioner är på en mer tekniknära nivå (eller hur man ska uttrycka det) och kan därmed vara lite krångligare.

Lyckligtvis behöver man bara skriva funktionerna för bläddring mellan poster osv en gång. Nästa gång är det bara att klippa och klistra. Dessutom finns det garanterat färdiga kodbibliotek som ger funktioner motsvarande Lassos i PHP. Dreamweaver jobbar t ex med sådana funktioner.

1
Bevaka tråden