Avatar billede oldschool Nybegynder
31. juli 2006 - 21:50 Der er 12 kommentarer og
1 løsning

Flere php actions på samme side

Hej

Jeg er ret ny i php og er ved at lave et lille nyheds cms.

I admin delen kan man vælge at få vist alle nyhederne samt muligheden for at "delete" eller "edit".

Jeg kan godt få det til at virke ved at have en delete_news.php og en edit_news.php side, men vil gerne samle de to i én. Således at jeg i linket sender en variabel med ex.

actions_news.php?go=delete&id=$id
eller
actions_news.php?go=edit&id=$id

Jeg kan godt få delete delen til at fungere, men jeg kan ikke få det til at fungere med edit da det jo indvolvere nogle textfiels osv.

nuværende news_actions.php:

<?php

include 'db.inc.php';

$go = $_GET['go'];


//IF DELETE
if($go == "delete"){
$id = $_GET['id'];
$ok = @mysql_query("DELETE FROM news_table WHERE id='$id'");
if ($ok) {
  echo '<p><h3>Deleted</h3></p>';
} else {
  echo '<p>Could not delete, sorry<br />'.
      'Error: ' . mysql_error() . '</p>';
}

}


//IF EDIT
if($go == "edit")


?>




Nuværende edit_news.php:

<?php

include 'db.inc.php';

if (isset($_POST['text'])):

  $text = $_POST['text'];
  $id = $_POST['id'];
  $sql = "UPDATE news_table SET
          text='$text'
          WHERE id='$id'";
  if (@mysql_query($sql)) {
    echo '<p>News updatet</p>';
  } else {
    echo '<p>Sorry, could not update news: ' .
        mysql_error() . '</p>';
  }

?>


<?php
else: // Allow the user to edit the news

  $id = $_GET['id'];
  $link = @mysql_query(
      "SELECT text FROM news_table WHERE id='$id'");
  if (!$link) {
    exit('<p>Error fetching news details: ' .
        mysql_error() . '</p>');
  }

  $link = mysql_fetch_array($link);
 
  $text = $link['text'];


?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<textarea name="text" cols="70" rows="10"><?php echo $text; ?></textarea>
</label><br />
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="submit" value="SUBMIT" /></p>
</form>

<?php endif; ?>



Altså vil jeg gerne have "integreret" edit_news.php i news_actions.php
Egentligt mest fordi jeg synes det er meget at have to sider til så lidt og selvfølgelig også for at lære noget:)

Håber i forstår hvad jeg mener og kan hjælpe...

Oldschool
Avatar billede jakobdo Ekspert
31. juli 2006 - 22:37 #1
Jeg ville evt. starte med at dele GO op i en switch case
f.eks.:
switch($_GET['go'])
{
case 'edit':
//her skal vi så redigere noget...
break;
case 'delete':
//her skal vi så slette noget...
break;
default:
//her gør vi noget, hvis noget kalder: side.php?go=nogetForkert
}
Avatar billede oldschool Nybegynder
31. juli 2006 - 23:02 #2
Det fungere også med delete funktionen, men jeg aner ikke hvordan jeg skal gribe den med edit an... Hvor skal jeg fx placere

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<textarea name="text" cols="70" rows="10"><?php echo $text; ?></textarea>
</label><br />
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="submit" value="SUBMIT" /></p>
</form>

-forresten, tak for hjælpen so far
Avatar billede jakobdo Ekspert
31. juli 2006 - 23:19 #3
Du kan rette:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
til:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>?go=edit" method="post">
Så gemmer du din edit kode ved: //her skal vi så redigere noget...
og så kører du videre! :o)
Avatar billede oldschool Nybegynder
31. juli 2006 - 23:31 #4
Hmm, kan ik rigtigt få det til at fungere.

Jeg får fejl ved den linje jeg skal erstatte

<?php

include 'db.inc.php';

switch($_GET['go']) {

//DELETE
case 'delete':

$id = $_GET['id'];
$ok = @mysql_query("DELETE FROM news_table WHERE id='$id'");
if ($ok) {
  echo '<p><h3>Deleted</h3></p>';
} else {
  echo '<p>Could not delete, sorry<br />'.
      'Error: ' . mysql_error() . '</p>';
}

break;

//EDIT
case 'edit':

if (isset($_POST['text'])):

  $text = $_POST['text'];
  $id = $_POST['id'];
  $sql = "UPDATE news_table SET
          text='$text'
          WHERE id='$id'";
  if (@mysql_query($sql)) {
    echo '<p>News updatet</p>';
  } else {
    echo '<p>Sorry, could not update news: ' .
        mysql_error() . '</p>';
  }


else:

  $id = $_GET['id'];
  $link = @mysql_query(
      "SELECT text FROM news_table WHERE id='$id'");
  if (!$link) {
    exit('<p>Error fetching news details: ' .
        mysql_error() . '</p>');
  }

  $link = mysql_fetch_array($link);
 
  $text = $link['text'];


<form action="<?php echo $_SERVER['PHP_SELF']; ?>?go=edit" method="post">
<textarea name="text" cols="70" rows="10"><?php echo $text; ?></textarea>
</label><br />
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="submit" value="SUBMIT" /></p>
</form>

break;

default:
echo 'ERROR, sorry';
break;
}

?>
Avatar billede jakobdo Ekspert
01. august 2006 - 00:05 #5
Test lige denne kode:

<?php

include 'db.inc.php';

switch($_GET['go'])
{
    //DELETE
    case 'delete':
        $id = intval($_GET['id']);
        $ok = @mysql_query("DELETE FROM news_table WHERE id='$id'");
        if ($ok)
        {
          echo '<p><h3>Deleted</h3></p>';
        }
        else
        {
          echo '<p>Could not delete, sorry<br />Error: ' . mysql_error() . '</p>';
        }
    break;

    //EDIT
    case 'edit':
    if (isset($_POST['text'])):
    {
      $text = mysql_real_escape_string($_POST['text']);
      $id = intval($_POST['id']);
      $sql = "UPDATE news_table SET text='$text' WHERE id='$id'";
      if (@mysql_query($sql))
      {
        echo '<p>News updatet</p>';
      }
      else
      {
        echo '<p>Sorry, could not update news: ' . mysql_error() . '</p>';
      }
    }
    else
    {
        $id = intval($_GET['id']);
      $link = @mysql_query("SELECT text FROM news_table WHERE id='$id'");
      if (!$link)
      {
        exit('<p>Error fetching news details: ' . mysql_error() . '</p>');
      }

      $link = mysql_fetch_array($link);

      $text = $link['text'];
  }

    echo '<form action="' . $_SERVER['PHP_SELF'] . '?go=edit" method="post">';
    echo '<textarea name="text" cols="70" rows="10">' . $text . '</textarea>';
    echo '</label><br />';
    echo '<input type="hidden" name="id" value="' . $id . '" />';
    echo '<input type="submit" value="SUBMIT" /></p>';
    echo '</form>';

    break;

    default:
        echo 'ERROR, sorry';
        break;
}

?>

Du bør dog også tilføje noget sikkerhed.
Bruger du et login system?
Som det er nu, kan alle slette ved at kalde filen.php?go=delete&id=1
Ligesom sql injections er muligt. (jeg har dog tilføjet en smule ekstra sikkerhed)
Avatar billede oldschool Nybegynder
01. august 2006 - 00:18 #6
Jeg bruger et simpelt login system, har bare ik tilføjet det endnu... Det er vist bare et der på hver side via et include script checker om man er logget ind...

Koden melder fejl i linje 38... unexpected '{', expecting ':' in ... line 38

Hvis jeg indsætter : istedet eller tilføjer : kommer der fejl længere nede og jeg ender med fejl i sidste linje.

Bliver nødt til at sove lidt, har kigget på de her koder alt alt for længe. Hvis du har tid til at se nærmere på det vil det være super ellers må jeg gå det hele igennem i morgen formiddag med friske øjne.

Men ihvertfald mange tak for hjælpen!
Avatar billede oldschool Nybegynder
01. august 2006 - 10:04 #7
Hmm, kan sku ikke få det til at fungere eller finde fejlen...
Hvis jeg følger de fejl den melder ender jeg ligegyldigt hvad jeg gør op med en unexpected $end i sidste linje...
Avatar billede jakobdo Ekspert
01. august 2006 - 13:36 #8
Her er løsningen:

<?php

include 'db.inc.php';

switch($_GET['go'])
{
    //DELETE
    case 'delete':
        $id = intval($_GET['id']);
        @mysql_query("DELETE FROM news_table WHERE id='$id'");
        if(mysql_affected_rows()==0)
        {
            echo '<p><h3>Deleted</h3></p>';
        }
        else
        {
            echo '<p>Could not delete, sorry<br />Error: ' . mysql_error() . '</p>';
        }
        break;

    //EDIT
    case 'edit':
        if (isset($_POST['text']))
        {
            $text = mysql_real_escape_string($_POST['text']);
            $id = intval($_POST['id']);
      @mysql_query("UPDATE news_table SET text='$text' WHERE id='$id'");
      if(mysql_affected_rows()==0)
      {
        echo '<p>News updatet</p>';
      }
      else
      {
        echo '<p>Sorry, could not update news: ' . mysql_error() . '</p>';
      }
    }
    else
    {
            $id = intval($_GET['id']);
            $link = @mysql_query("SELECT text FROM news_table WHERE id='$id'");
            if(mysql_num_rows($link)!=1)
      {
        exit('<p>Error fetching news details: ' . mysql_error() . '</p>');
      }

            $link = mysql_fetch_array($link);

            $text = $link['text'];
        }

    echo '<form action="' . $_SERVER['PHP_SELF'] . '?go=edit" method="post">';
    echo '<textarea name="text" cols="70" rows="10">' . $text . '</textarea>';
    echo '</label><br />';
    echo '<input type="hidden" name="id" value="' . $id . '" />';
    echo '<input type="submit" value="SUBMIT" /></p>';
    echo '</form>';

    break;

    default:
        echo 'ERROR, sorry';
        break;
}

?>

Har rettet lidt mere i din kode.
Og fejlen i 38 var:

if (isset($_POST['text'])): <----- (FJERNEDE : )
Avatar billede oldschool Nybegynder
01. august 2006 - 13:47 #9
Jæs sir!

Det eneste som er lidt underligt er at den skriver "could not delete" og "could not update" selvom den både kan slette og opdatere, ellers meget smukt:O)

Så hvis du har en idé til det vil det være fantastisk, ellers må du meget gerne smide et svar...
Avatar billede oldschool Nybegynder
01. august 2006 - 13:53 #10
Har fundet ud af det if(mysql_affected_rows()==0) skulle være if(mysql_affected_rows()==1)

Mange tak for hjælpen, fantastisk!

Smid et svar:)
Avatar billede jakobdo Ekspert
01. august 2006 - 13:56 #11
Svar!
Avatar billede jakobdo Ekspert
01. august 2006 - 14:07 #12
Takker for point...
Avatar billede oldschool Nybegynder
01. august 2006 - 14:13 #13
Og jeg takker for hjælpen:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester