webForumDet fria alternativet

Någon som kan hitta felet?

PHPur PHP

18 svar · 766 visningar · startad av Guldstrand

Medlem sedan juli 20041 271 inlägg
Frågan#1

Jag håller på med ett script till en liten community där alla användare ska kunna ladda upp x antal filmer.
Det fungerar bra att ladda upp och lista filmerna för alla medlemmar, men har lite strul med att radera filmer.

Får bara...

FEL
Ogiltigt ID.

Är tacksam ifall någon kunde kolla igenom koden.

<?php 
require "include/config.php";
dbconn(false);
loggedinorreturn();

function bark($msg)
{
  stdhead();
  stdmsg("Fel", $msg);
  stdfoot();
  exit;
}

$id = 0 + $_GET["id"];

if (!is_valid_id($id))
  bark("Ogiltigt ID.");

$r = @mysql_query("SELECT * FROM users WHERE id=$id") or sqlerr();
$user = mysql_fetch_array($r) or bark("Finns ingen medlem med detta ID.");

$delete = $HTTP_GET_VARS["delete"];
if (is_valid_id($delete))
{
 $r = mysql_query("SELECT * FROM filmer WHERE id=$delete") or sqlerr(__FILE__, __LINE__);
 if (mysql_num_rows($r) == 1)
 {
  $a = mysql_fetch_assoc($r);
  if (get_user_class() >= UC_USER)
  {
   mysql_query("DELETE FROM filmer WHERE id=$delete") or sqlerr(__FILE__, __LINE__);
   if (!unlink("/home/var/www/*****/filmer/$user[username]/$a[name]"))
    stderr("Fel", "Kunde inte radera filen (filmen): <b>$a[filename]</b>. Var god kontakta ansvarig.");
  }
 }
}

stdhead("$user[username]´s Filmer");

$res = mysql_query("SELECT count(*) FROM filmer WHERE owner = $user[id]") or die(mysql_error());
$row = mysql_fetch_array($res);
$count = $row[0];
$perpage = 15;
list($pagertop, $pagerbottom, $limit) = pager($perpage, $count, $_SERVER["PHP_SELF"] . "?out=" . $_GET["out"] . "&" );

print("<h1>$user[username]´s Filmer</h1>\n");

echo $pagertop;

$res = mysql_query("SELECT added, id, owner, name, kommentar FROM filmer WHERE owner = $user[id] ORDER BY added DESC $limit") or sqlerr(__FILE__, __LINE__);
if (mysql_num_rows($res) == 0)
print("<b>$user[username] har inte laddat upp några filmer, än.</b>\n");
else
{
$mod = get_user_class() >= UC_USER;

print("<table width=500 border=1 cellspacing=0 cellpadding=5>\n");
print("<tr><td class=colhead align=left>Datum</td><td class=colhead align=left>Tid</td><td class=colhead align=left>Screen</td>" .
($mod ? "<td class=colhead align=left>Åtgärd</td>" : "") . "</tr>\n");

while ($arr = mysql_fetch_assoc($res))
{
 $r2 = mysql_query("SELECT * FROM users WHERE id=$arr[owner]") or sqlerr();
 $a2 = mysql_fetch_assoc($r2);
    $date = substr($arr['added'], 0, strpos($arr['added'], " "));
    $time = substr($arr['added'], strpos($arr['added'], " ") + 1);
 $name = $arr["name"];
 $kommentar = $arr["kommentar"];
 $url = str_replace(" ", "%20", htmlspecialchars("/filmer/$a2[username]/$name"));
 print("<tr bgcolor=$bgcolor><td>$date</td><td>$time</td><td><a href=$url target=_blank><img src=$url border=0 width=150 alt='$kommentar' title='$kommentar'></a></td>" .
 ($mod ? "<td><a href=?delete=$arr[id]>[Radera]</a></td>" : ""). "</tr>\n");
}
print("</table>");
}

echo $pagerbottom;

end_main_frame();

stdfoot();

?>
Medlem sedan mars 20021 152 inlägg
#2

Är fortfarande inget bra på php, kan inte avgöra om felet anges av php eller ditt skript.
Tycker det saknas {} på ett par if .

Medlem sedan juni 200032 967 inlägg
#3

Tycker det saknas {} på ett par if .

Man behöver inte använda måsvingar om det som ska utföras bara är en rad / ett statement.

Medlem sedan apr. 200312 679 inlägg
#4

@nders skrev:

Tycker det saknas {} på ett par if .

Man behöver inte använda måsvingar om det som ska utföras bara är en rad / ett statement.

Den regeln trodde jag bara gällde i .net. :) Man lär sig nåt nytt... :OO

Medlem sedan okt. 2000149 inlägg
#5

Hur ser is_valid_id-funktionen ut?

Medlem sedan mars 2007845 inlägg
#6

innehåller $_GET["id"] något värde? Det borde isf synas i adressfältet.

Hur ser funktionerna loggedinorreturn() och is_valid_id() ut?

/D

Medlem sedan juli 20011 129 inlägg
#7

Jag är inte hemma på PHP, men för att påpeka det självklara så verkar det vara detta den gnäller på:


$id = 0 + $_GET["id"];

if (!is_valid_id($id))
  bark("Ogiltigt ID.");

Testa att skriv ut $id och is_valid_id($id) och om det returnerar false, ta bort 0:an eller något?
Jag vet inte hur is_valid_id funktionen ser ut.

Medlem sedan mars 2007845 inlägg
#8

silfver skrev:

Den regeln trodde jag bara gällde i .net. :) Man lär sig nåt nytt... :OO

Den regeln gäller dom flesta programmerings- och skriptspråk.

/D

Medlem sedan mars 20021 152 inlägg
#9

@nders skrev:

Tycker det saknas {} på ett par if .

Man behöver inte använda måsvingar om det som ska utföras bara är en rad / ett statement.

Jag lär mig lite mer varje dag. :)

Medlem sedan juli 20041 271 inlägg
#10

drew skrev:

innehåller $_GET["id"] något värde? Det borde isf synas i adressfältet.

Hur ser funktionerna loggedinorreturn() och is_valid_id() ut?

/D

Ja, $_GET[""id] får rätt värde (tror jag).. länken blir https://www.mindoman.se/minafilmer.php?delete=3 när jag försöker radera en film.

function loggedinorreturn() {
    global $CURUSER;
    if (!$CURUSER) {
        header("Location: $BASEURL/login.php?returnto=" . urlencode($_SERVER["REQUEST_URI"]));
        exit();
    }
}
function is_valid_user_class($class)
{
  return is_numeric($class) && floor($class) == $class && $class >= UC_USER && $class <= UC_SYSOP;
}

function is_valid_id($id)
{
  return is_numeric($id) && ($id > 0) && (floor($id) == $id);
}

..har begränsad kunskap/erfarenhet av php/mysql. :r

Medlem sedan mars 2007845 inlägg
#11

Börja med att ändra

$id = 0 + $_GET["id"];

till

$id = 0 + $_GET["delete"];

Variabeln du skickar med heter inte id utan delete.

Eller om id ska kunna innehålla andra värden så bör du ändra i forumläret så den sickar id=3 istället för delete=3

/D

Medlem sedan juli 20041 271 inlägg
#12

drew skrev:

Börja med att ändra

$id = 0 + $_GET["id"];

till

$id = 0 + $_GET["delete"];

Variabeln du skickar med heter inte id utan delete.

Eller om id ska kunna innehålla andra värden så bör du ändra i forumläret så den sickar id=3 istället för delete=3

/D

Tror inte jag kan göra det...

$id = 0 + $_GET["id"];

..används till att känna igen RÄTT användare.

Medlem sedan mars 2007845 inlägg
#13

Då innehåller inte $_GET["id"] någonting. Prova ett echo $_GET["id"];

/D

Medlem sedan mars 20034 471 inlägg
#14

Guldstrand skrev:

Tror inte jag kan göra det...

$id = 0 + $_GET["id"];

..används till att känna igen RÄTT användare.

Jo, men... om URL:n är https://www.mindoman.se/minafilmer.php?delete=3 så är ju $_GET["id"] inte satt!

Antingen ligger problemet i din action i formen som borde skicka dig till sidan:

echo '<form name="..." action="www.mindoman.se/minafilmer.php?id='.$_GET["id"].' ....';

Eller så vill du inte hämta användarens id via formen utan från $_COOKIE eller $_SESSION gissningsvis...

Medlem sedan juli 20041 271 inlägg
#15

Har inget form element, utan bara följande...

$delete = $HTTP_GET_VARS["delete"];
if (is_valid_id($delete))
{
 $r = mysql_query("SELECT * FROM filmer WHERE id=$delete") or sqlerr(__FILE__, __LINE__);
 if (mysql_num_rows($r) == 1)
 {
  $a = mysql_fetch_assoc($r);
  if (get_user_class() >= UC_USER)
  {
   mysql_query("DELETE FROM filmer WHERE id=$delete") or sqlerr(__FILE__, __LINE__);
   if (!unlink("/home/var/www/*****/filmer/$user[username]/$a[name]"))
    stderr("Fel", "Kunde inte radera filen (filmen): <b>$a[filename]</b>. Var god kontakta ansvarig.");
  }
 }
}

Sedan länken för att radera en film:
<a href=?delete=$arr[id]>[Radera]</a>

Medlem sedan mars 20034 471 inlägg
#16

Guldstrand hur du än komponerar länken innehåller den inget id efter frågetecknet! Det enda index du kan hämta ut från $_GET är delete.

<a href=?delete=$arr[id]>[Radera]</a>

Medlem sedan juli 20041 271 inlägg
#17

aasah skrev:

Guldstrand hur du än komponerar länken innehåller den inget id efter frågetecknet! Det enda index du kan hämta ut från $_GET är delete.

<a href=?delete=$arr[id]>[Radera]</a>

Hmm, ok... :q
Hur löser jag detta då?

Börjar snurra till riktigt i skallen nu.

Medlem sedan mars 20034 471 inlägg
#18

Guldstrand skrev:

Hmm, ok... :q
Hur löser jag detta då?

Börjar snurra till riktigt i skallen nu.

Fundera över vad du vill få ut av länken. Om du vill att delete ska ha värdet av den fil som ska bort och id ska ha värdet av vem som vill ta bort det, får du konstruera länkar efter följande modell:

echo "<a href=\"www.mindoman.se/minafilmer.php?delete=<filmid>&id=<personid>\">ta bort filmnamn</a>";

Men då återstår frågan var du från början hittar värdet på vem som använder skriptet? Hur kommer du till sidan från början? Har du en inloggning innan man kan ta bort? Var lagras personid:t i så fall?

Medlem sedan juli 20041 271 inlägg
#19

Man kommer till användarens filmer genom att gå till minafilmer.php?id=*id:et på användaren*

Denna kod kontrollerar så att man är inne på rätt användares filmer.

$id = 0 + $_GET["id"];

if (!is_valid_id($id))
  bark("Ogiltigt ID.");

$r = @mysql_query("SELECT * FROM users WHERE id=$id") or sqlerr();
$user = mysql_fetch_array($r) or bark("Finns ingen medlem med detta ID.");

Det ska bara vara användaren själv som ska kunna radera sina filmer på den sidan.

Tacksam för all hjälp.

147 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
145 ms — hämta tråd, inlägg och bilagor (db)