Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Linkkilista MySql:llä

Akseli F [18.08.2004 19:14:59]

#

Linkkilista joka on toteutettu php:llä. Tarvitsee MySQL tietokannan.
Admin osoissa ei ole salasanasuojausta, sen saatte tehdä itse. Valikko on omassa tiedostossa, jotta alueiden poistaminen/lisääminen/muokkaaminen olisi helpompaa.

Ensin sinun pitää luoda taulu tietokantaan seuraavalla komennolla:

CREATE TABLE linkit (
  osoite VARCHAR(100),
  linkkiteksti VARCHAR(100),
  kuvaus TEXT,
  ryhma INT(2)
)

Tämän jälkeen kopioi tiedostot palvelimelle.
Kun lisäät linkkejä, muista laittaa http:// osoitteen alkuun.

valikko.php

<select name="ryhma">
<option value=0>Alue 1</option>
<option value=1>Alue 2</option>
<option value=2>Alue 3</option>
<option value=3>jne.</option>
</select>

linkit.php

<html><head><title>Linkit</title></head><body>

<h1>Linkit: </h1>

     <?php
     //Otetaan "sarja" muuttujaan tieto siitä mikä kategoria on kyseessä
     $sarja = $_GET['sarja'];

          //tulostetaan taulun aloitus sekä otsikkosolut
          echo "<table>";
          echo "<tr><td colspan=2>";
          echo "<form method=post action=\"toimitus.php\">";
          //luodaan tarvittava piilokenttä. Katso lisää listauksesta 3
          echo "<input type=\"hidden\" name=\"tehtava\" value=3>";

//Liitetän valikko alueista ja lopetetaan lomake
include("../valikko.php");


     echo "   <input type=\"submit\" value=\"Siirry\"></form>";
     echo "<hr width=218 align=left></td></tr>";
     echo "<tr><th>Linkki</th><th>Kuvaus</th></tr>";

          //Pistä asetukset oikein
          $serveri = "";          //Palvelimen osoite
          $tunnus = "";           //Tunnus tietokantaan
          $ssana = "";            //Sakasana tietokantaan
          $db = "";               //Tietokannan nimi

//Otetaan yhteys tietokantaan
$mysql = mysql_connect($serveri,$tunnus,$ssana) or die ("Tietokantaan ei saatu yhteyttä");
mysql_select_db($db, $mysql);

//Kysely tietokantaan
$kysely = mysql_query("SELECT * FROM linkit", $mysql);
//for-lause käy läpi kaikki rivit tietokannassa
for ($tietue = 0; $tietue < mysql_num_rows($kysely); $tietue++) {

       $osoite = mysql_result($kysely, $tietue, "osoite");
  $linkkiteksti = mysql_result($kysely, $tietue, "linkkiteksti");
       $kuvaus = mysql_result($kysely, $tietue, "kuvaus");
        $ryhma = mysql_result($kysely, $tietue, "ryhma");


   //poistetaan ylimääräiset kenoviivat osoite ja kuvaus kentistä
   $osoite = stripslashes($osoite);
   $kuvaus = stripslashes($kuvaus);

   //tee seuraavista riveistä kommentteja(// rivin alkun), jos haluat sallia html:än linkkitekstissä
   $linkkiteksti = str_replace("<", "<", $linkkiteksti);
   $linkkiteksti = str_replace(">", ">", $linkkiteksti);

   //tee seuraavista riveistä kommentteja(// rivin alkun), jos haluat sallia html:än kuvauksssa
   $kuvaus = str_replace("<", "<", $kuvaus);
   $kuvaus = str_replace(">", ">", $kuvaus);

  //jos ryhma on saman arvoinen kuin sarja, tulostetaan linkki
  if($ryhma == $sarja)
  {
  echo "<tr><td width=200><a href=\"$osoite\">$linkkiteksti</a></td><td width=600>$kuvaus</td></tr>";
  echo "<tr><td colspan=2><hr></td></tr>";
  }
  }

     //suljetaan yhteys
     mysql_close($mysql);

        echo "</table>";


   ?>

</body></html>

toimitus.php

<?php

//Ohjelmalle välitetään piilokmenttä "tehtava", josta tämä skripti katsoo mikä toimenpide suoritetaan.

//Otetaan tehtävä talteen, josta katsotaan mikä toimitus
//tehdään:
$tehtava = $_POST['tehtava'];

          //Pistä asetukset oikein
          $serveri = "";          //Palvelimen osoite
          $tunnus = "";           //Tunnus tietokantaan
          $ssana = "";            //Sakasana tietokantaan
          $db = "";               //Tietokannan nimi

//Otetaan yhteys tietokantaan
$mysql = mysql_connect($serveri,$tunnus,$ssana) or die ("Tietokantaan ei saatu yhteyttä");
mysql_select_db($db, $mysql);

///////////////////////////////////

//jos tehtava on 0, tallennetaan, on kyseessä linkin tallennus tietokantaan
if($tehtava == 0) {

$posts = array('osoite','linkkiteksti','kuvaus'); // tarkistettavat lomakkeen kentät
$error == false;
foreach($posts as $post){

  if(($$post = get_magic_quotes_gpc() ? $_POST["$post"] : mysql_escape_string($_POST["$post"])) == "")
    $error .= "Et ole täyttänyt kenttää <b>\"$post\"</b>.<br >";
}
if($error){
  die("<html><head><title>Error</title><body>$error</body></html>");
}else{



//SQL-lause
$sql = mysql_query("INSERT INTO linkit (osoite,linkkiteksti, kuvaus, ryhma)
        VALUES ('$osoite','$linkkiteksti','$kuvaus','$ryhma')", $mysql);



//Jos linkinlisäys tietokantaan onnistui, tulostetaan käyttäjälle linkit adminiin ja itse listaan...
if(sql)
{
print "<a href=\"admin.php\">Admin</a><br>";
print "<a href=\"linkit.php\">Linkkilista</a><br>";
print "<a href=\"linkit.php?sarja=$ryhma\">kohtaan, johon linkki lisättiin</a><br>";
//...muuten tulostetaan virheilmoitus
} else {
print "Virhe tietoja tallentaessa!";
}
}
///////////////////////////////////

//jos tehtava on 1, poistetaan linkki
} else if($tehtava == 1) {

$osoite = $_POST['poistettava'];  //poistettavan linkin osoite

// Jos käyttäjä ei ole täyttänyt kenttää, tulostetaan virheilmoitus
  if($osoite == ""){
    $error .= "Et kertonut mikä linkki poistetaan.<p>";
}
if($error){
  die("<html><head><title>Error</title><body>$error</body></html>");
}else{

//SQL-komento
$sql = mysql_query("DELETE FROM linkit WHERE osoite = '$osoite'", $mysql);

//Jos linkinposto onnistui, tulostetaan käyttäjälle linkit adminiin ja itse listaan...
if(sql)
{
print "<a href=\"admin.php\">Admin</a><br>";
print "<a href=\"linkit.php\">Linkkilista</a><br>";
//...jos on tapahtunut virhe tulostetaan virheilmoitus
} else {
print "Virhe tietoja tallentaessa!";
}
}
///////////////////////////////////

//jos tehtävä on 2, päivitetään linkki:
} else if($tehtava == 2) {


$posts = array('vosoite', 'osoite','lt','kuvaus'); // tarkistettavat lomakkeen kentät
$error == false;
foreach($posts as $post){

if($$post == ""){
$error .= "Vaadittu kenttä <b>\"$post\"</b> puuttuu<br >";
}
}
//  if(($$post = get_magic_quotes_gpc() ? $_POST["$post"] : mysql_escape_string($_POST["$post"])) == "")

if($error){
  die("<html><head><title>Error</title><body>$error</body></html>");
}else{

//SQL-lause
$sql = mysql_query("UPDATE `linkit` SET `osoite` = '$osoite', `linkkiteksti` = '$lt', `kuvaus` = '$kuvaus', `ryhma` = '$ryhma' WHERE `osoite` = '$vosoite' LIMIT 1", $mysql);


if(sql)
{
print "<a href=\"admin.php\">Admin</a><br>";
print "<a href=\"linkit.php?\">Linkkilista</a><br>";
print "<a href=\"linkit.php?sarja=$ryhma\">kohtaan, johon linkki päivitettiin</a><br>";
//...muuten tulostetaan virheilmoitus
} else {
print "Virhe tietoja tallentaessa!";
}
}
///////////////////////////////////////////////////////////

//jos tehtävä on 3, siirretään käyttäjä sille sivulle jolle lomakkeen "ryhma" -kenttä osoittaa.
//Kuuluu "linkit.php" sivulla liikkumiseen

} else if($tehtava == 3) {

          $ryhma = $_POST['ryhma'];

header("Location: linkit.php?sarja=$ryhma");

///////////////////////////////////

//jos tehtävä ei ole 0, 1 tai 2 on tapahtunut virhe
} else {
print" Virhe ohjelman toiminnassa.";
}

mysql_close($mysql);

?>

admin.php

<html><head><title>Linkit: Admin</title></head><body>

<table>

<tr><td colspan=2>
<h1>Linkit: admin: </h1>
</td></tr>
<?php
//Jos mode on lisaa, näytetään lisäys lomake
if($_GET['mode']==lisaa) {print "

<tr><td colspan=2>
<h3>Lisää linkki: </h3>
</td></tr>

<form action=\"toimitus.php\" method=\"post\">
<input type=\"hidden\" name=\"tehtava\" value=0>

<tr><td>Osoite: </td><td><input type=\"text\" name=\"osoite\" size=23></td></tr>
<tr><td>Linkkiteksti: </td><td><input type=\"text\" name=\"linkkiteksti\" size=23></td></tr>
<tr><td>Kuvaus: </td><td><input type=\"text\" name=\"kuvaus\" size=23></td></tr>
<tr><td>Kategoria: </td>
<td>";

include("valikko.php");

print "
</td></tr>
<tr><td><input type=\"submit\" value=\"Lisää linkki!\"></td><td><input type=\"reset\" value=\"Tyhjennä\"></td></tr>
</form>

"; } //lopeteaan ehto
//Jos mode on poista, näytetään poisto lomake
else if($_GET['mode']==poista) {print "

<tr><td colspan=2>
<p><h3>Poista linkki: </h3>
</td></tr>

<form action=\"toimitus.php\" method=\"post\">
<input type=\"hidden\" name=\"tehtava\" value=1>

<tr><td>Poistettavan linkin osoite: </td><td><input type=\"text\" name=\"poistettava\" size=23></td></tr>
<tr><td><input type=\"submit\" value=\"poista linkki!\"></td><td><input type=\"reset\" value=\"Tyhjennä\"></td></tr>
</form>

"; } //lopeteaan toinen ehto
//Jos mode on paivita, näytetään päivitys lomake
else if($_GET['mode']==paivita) {print "

<tr><td colspan=2>
<p><h3>Päivitä linkki: </h3>
</td></tr>

<form method=\"post\" action=\"toimitus.php\">
<input type=\"hidden\" name=\"tehtava\" value=2>
<tr><td>Vanha osoite: </td><td><input type=\"text\" name=\"vosoite\" size=23></td></tr>
<tr><td>Uusi osoite: </td><td><input type=\"text\" name=\"osoite\" size=23></td></tr>
<tr><td>Linkkiteksti: </td><td><input type=\"text\" name=\"lt\" size=23></td></tr>
<tr><td>Kuvaus: </td><td><input type=\"text\" name=\"kuvaus\" size=23></td></tr>
<tr><td>Kategoria: </td><td>";

include("valikko.php");

print "
</td></tr>
<tr><td><input type=\"submit\" value=\"Päivitä linkki!\"></td><td><input type=\"reset\" value=\"Tyhjennä\"></td></tr>
</form>
"; }  //lopetetaan viimeinenkin ehto
?>

<tr><td colspan=2><p>
<a href="admin.php?mode=lisaa">Linkkien lisäys</a>
<a href="admin.php?mode=poista">Linkkien poisto</a>
<a href="admin.php?mode=paivita">Linkkien päivitys</a>
<a href="linkit.php">Linkkilista</a>
</td></tr>
</table>
</body>
</html>

makeuu [19.08.2004 18:08:23]

#

hienoo ;)

Olga [19.08.2004 18:17:28]

#

Käyttäjien syötteet olisi hyvä tarkistaa (+ muuntaa turvalliseen muotoon) ennen kannan käpelöintiä, oli tilanne sitten mikä tahansa.

ajv [19.08.2004 19:53:13]

#

Tässä pieni esimerkki, miten tuota arvojen tarkistusta (muuntamista turvalliseen muotoon) saa hieman automatisoitua:

<?php
$posts = array('osoite','lt','kuvaus'); // tarkistettavat lomakkeen kentät
$error = false;
foreach($posts as $post){
  if(($$post = get_magic_quotes_gpc() ? $_POST["'$post'"] : mysql_escape_string($_POST["'$post'"])) == "")
    $error .= "Vaadittu kenttä <b>\"$post\"</b> puuttuu<br >";
}
if($error){
  die("<html><head><title>Error</title><body>$error</body></html>");
}else{
  // jatketaan ja suoritetaan kyselyt...
  // lomakkeen tarkistetut tiedot löytyvät sen kenttien nimisistä muuttujista ($osoite, $lt, $kuvaus)
}
?>

Akseli F [22.08.2004 18:06:18]

#

Kiitos koodista ajv. Nyt ohjelman pitäisi estää tyhjien kenttien tallentaminen. Pari muutakin pikku parannusta olen tehnyt. Nyt koodi estää myös html:n, ellei toisin haluta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta