Ser ok ut. :)
En fråga: Kan du inte använda dig av färre SQL-frågor på något sätt? Det ser lite jobbigt ut att använda så många. :)
19 svar · 454 visningar · startad av LAMP
Någon vänlig själ som vill hacka lite på min första kod i PHP.
Alla tips på förbättringar mottages tacksamt. Hacka på, jag tål det ;)
<?php
// *** inkludera ett connectionobjekt ***
require("connection.php");
// *** Gör en select och loopa ut alla kategorier ***
$strSQL = ("SELECT intCategoryId, strName, strDescription FROM Forums_category
ORDER BY strName ASC");
$Result = mysql_query( $strSQL )
or die( mysql_error() );
if( mysql_num_rows( $Result ) < 1 )
{
print ("<tr><td colspan=\"6\" style=\"background-color:#B1BFC9;\"><p><b>Ett fel inträffade. Det gick inte hämta från databasen, prova ladda om sidan.</b></p></td></tr>\n");
}
else {
while ($data = mysql_fetch_array($Result)) {
print ("<tr><td colspan=\"6\" style=\"background-color:#B1BFC9;\"><p><b> " .$data['strName']. " </b></p></td></tr>\n");
// *** definera en variabel att jämföra med ***
$id = $data["intCategoryId"];
// *** Hämta alla forum som tillhör kategorin ***
$strSQL = ("SELECT IntForumId, intCatagoryId, strForumUse, strForumName, intForumLedareMemberId
FROM Forums_forum WHERE intCatagoryId = '$id' ORDER BY strForumName ASC");
$mysqlResult = mysql_query( $strSQL )
or die( mysql_error() );
if( mysql_num_rows( $mysqlResult ) < 1 ) {
print ("<tr><td colspan=\"6\" style=\"background-color:#B1BFC9;\"><p><b>Ett fel inträffade. Det gick inte hämta från databasen, prova ladda om sidan.</b></p></td></tr>\n");
}
else {
while ($data2 = mysql_fetch_array($mysqlResult)) {
// *** Definiera variabler som ska användas ***
$intForumId = $data2["IntForumId"];
$strForumName = $data2["strForumName"];
$strForumUse = $data2["strForumUse"];
// *** Skriv ut de olika forumen ***
print ("<tr>");
print ("<td width=\"20\" valign=\"middle\" bgcolor=\"#C0CFD9\">Ic</td>\n");
print ("<td width=\"380\" valign=\"middle\"><p><a href=\"threadlist.php?forumid=$intForumId\">$strForumName</a><br>$strForumUse</p></td>\n");
print ("<td width=\"50\" valign=\"middle\" align=\"center\" bgcolor=\"#C0CFD9\">");
// *** Räkna ut hur många trådar det finns i aktuellt forum ***
$res = mysql_query("SELECT IntForumId FROM Inlagg WHERE IntForumId = '$intForumId' AND Orginal = 1", $db);
$antaltopics = mysql_num_rows($res);
// *** Skriv ut hur många trådar det finns i aktuellt forum ****
print ("<p><b>$antaltopics</b></p></td>\n");
// *** Räkna ut hur många inlägg det finns i aktuellt forum ***
$result = mysql_query("SELECT IntForumId FROM Inlagg WHERE IntForumId = '$intForumId'", $db);
$antalthreads = mysql_num_rows($result);
// *** Skriv ut hur många inlägg det finns i aktuellt forum ****
print ("<td width=\"50\" valign=\"middle\" align=\"center\" bgcolor=\"#C0CFD9\"><p><b>$antalthreads</b></p></td>\n");
// *** Hämta senaste inlägget och skribent i forumet ***
$SQL = ("Select Profil.Username, Profil.AnvId, Inlagg.Inlagg_AnvId, Inlagg.IntForumId, Inlagg.dteDate
FROM Inlagg
LEFT JOIN Profil
ON Inlagg.Inlagg_AnvId = Profil.AnvId
WHERE Inlagg.IntForumId = '$intForumId' ORDER by Inlagg.dteDate DESC LIMIT 1");
$last_post_result = mysql_query( $SQL )
or die( mysql_error() );
if( mysql_num_rows( $last_post_result ) < 1 ) {
print ("<td width=\"120\" valign=\"middle\"><p> </p></td>\n");
}
else {
$data3 = mysql_fetch_array($last_post_result);
$last_topicdate = $data3["dteDate"];
$last_topicdate = substr($last_topicdate, 0, 16);
$last_topicwriter = $data3["Username"];
print ("<td width=\"120\" valign=\"middle\"><p>$last_topicdate av $last_topicwriter</p></td>\n");
}
print ("<td width=\"130\" valign=\"middle\" bgcolor=\"#C0CFD9\">Forumledare</td>\n");
print ("</tr>");
}
}
}
}
mysql_close ();
?>
Ser ok ut. :)
En fråga: Kan du inte använda dig av färre SQL-frågor på något sätt? Det ser lite jobbigt ut att använda så många. :)
Jag har slagit ihop de jag kan till joinar. Eftersom databasen är normaliserad så långt det går så blir det svårt att använda färre. I varja fall med min kunskap i SQL.
Har du något konkret tips på vilka som tekniskt sätt skulle gå att slå ihop. Tabellerna till forumet i stort ser ut så här:
kategorier - innehåller forumkategorier (id, namn, beskrivning)
forum - innehåller de olika forumen (id, namn, beskrivning, kategoriid, forumledarid)
trådar - innehåller (trådid, subject, datum, forumid, memberid)
inlägg - innehåller (meddelande, memberid, datum, trådid, orginal, mfl)
Tillvägagångssätt nu är att loopa ut alla kategorier, och för varje kategoriid loopa ut forumen tillsammans med lite statestik, som tex senaste inlägg, antal trådar, antal inlägg.
Nej, jag är ingen höjdare på SQL - jag tyckte bara att det såg pillimarigt ut. :)
Om du bara vill ha antalet poster så är det bättre att använda select count(*) än mysql_num_rows
Varför har du apostrofer kring värdet om det är ett tal (som namnet antyder)
IntForumId = '$intForumId'
Det är nästan bara Mysql som tillåter att du blandar typer på detta vis.
LarsG skrev:
Om du bara vill ha antalet poster så är det bättre att använda select count(*) än mysql_num_rows
Varför har du apostrofer kring värdet om det är ett tal (som namnet antyder)
IntForumId = '$intForumId'Det är nästan bara Mysql som tillåter att du blandar typer på detta vis.
Jag har läst att man ska ha apostrofer kring alla variabler i SQL-frågor för att förhindra att "dumma besökare" skickar med tex kommenteringstecken som #, vilket skulle resultera i att eventuella vilkorssatser aldrig kontrolleras.
Ska genast byta till SELECT COUNT(*) :D
Det du skall göra är att kontrollera att alla numeriska värden som matas in av en användare bara innehåller giltiga tecken.
Nej, det skulle inte hjälpa. I sådana fall skulle du säga "SELECT (fälten) FROM Forums_forum WHERE intCatagoryId = '".addslashes($id)."' ORDER BY strForumName ASC". Problemet du syftar på är att man kan köra egna SQL-strängar om man är elak, det har inget med PHP-koden att göra, men jag skulle nog rekommendera att casta till int i stället. Sen har du lite onödiga paranteser som borde bort också.
$id = (int) $id;
$strSQL = "SELECT IntForumId, intCatagoryId, strForumUse, strForumName, intForumLedareMemberId ".
"FROM Forums_forum WHERE intCatagoryId = $id ORDER BY strForumName ASC";
Dessutom är jag av den åsikten att ungersk notation är ett verk av Beelzebub själv, men det är ju bara min åsikt :stud
Okey, två följdfrågor:
Hur kollar jag om det är giltiga tecken? I ASP finns ju funktionen IsNumeric(), finns det liknande i PHP?
Hur får jag ut resultetet från count(*) på ett smidigt sätt utan att använda count(*) as intAntal. I ASP kan man ju använda RS(0). Hur gör man det i PHP?
spango skrev:
Dessutom är jag av den åsikten att ungersk notation är ett verk av Beelzebub själv, men det är ju bara min åsikt :stud
Tack för dina ypperliga förslag, men ursäkta, jag älskar :f ungersk notation och har svårt att ta död på min lilla darling. :D
Hur tycker du man ska skriva namn på variabel, tabell, metod, function etc ?
1. is_numeric();
2.
$mysqlResult = mysql_query( "SELECT COUNT(*) FROM TABLE" );
$antal = mysql_result( $mysqlResul, 0 );
LAMP skrev:
Hur tycker du man ska skriva namn på variabel, tabell, metod, function etc ?
Efter vad de gör och är, inte vad de består av. Exempelvis $strSql ⇒ $sql, intForumId ⇒ forumId, strForumName ⇒ forumName, dteDate ⇒ postingDate eller writtenOn.
Nu är jag kanske ute på hal is, men jag vill minnas att (jag läst i någon bok att) PHP kör funktionen addslashes() på alla variabler automagiskt?
Bör man rent av göra som man alltid gör i ASP när man tar emot okänd data som ska behandlas av SQL-frågor:
$escaped_string = ereg_replace("'","''",$string_with_single_quotes);
Och jag skulle vilja veta vad UNGERSK NOTATION är? :)
det är ett sätt att döpa variabler som anger vilken typ av variabel det är. Ex
$strName - string
$intUserId - integer
$dteDate - datum
Finns en hel lista här:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q173738
Nu är jag kanske ute på hal is, men jag vill minnas att (jag läst i någon bok att) PHP kör funktionen addslashes() på alla variabler automagiskt?
Japp, det gör den. Men det kan man stänga av. :)
set_magic_quotes_runtime( 0 ); // Av
set_magic_quotes_runtime( 1 ); // På
Bör man rent av göra som man alltid gör i ASP när man tar emot okänd data som ska behandlas av SQL-frågor:
Ja, du bör alltid replace:a skumma tecken. Jag brukar alltid köra htmlentities(), för att få HTML-entiteter istället för dubbla ''. Ex:
$str = htmlentities( $str );
Och jag skulle vilja veta vad UNGERSK NOTATION är?
Det är när du har med typen av variabeln innan namnet:
$dteDatum = date( "Y-m-d" );
$dteTime = time();
$strLand = $_GET[ 'land' ];
// osv...
Japp, det gör den. Men det kan man stänga av.
set_magic_quotes_runtime( 0 ); // Av
set_magic_quotes_runtime( 1 ); // På
Gör man det längst upp på sidan, eller gör man det i PHP inställningsfil?
Du kan göra det i PHP.ini, men då ser det inte ut så där. :)
Det där var exempelkod på hur du gör, och förslagsvis gör du det högst upp på dina sidor. :)
Tack!