Avatar billede djsteiner Nybegynder
30. december 2011 - 19:14 Der er 15 kommentarer og
1 løsning

Fejl i script

Hej jeg får denne fejl frem når jeg prøver at køre et script:

Notice: Undefined index: id in C:\wamp\www\imagevoting\index.php on line 10 Call Stack: 0.0013 736584 1. {main}() C:\wamp\www\imagevoting\index.php:0 Notice: Undefined index: vote in C:\wamp\www\imagevoting\index.php on line 11 Call Stack: 0.0013 736584 1. {main}() C:\wamp\www\imagevoting\index.php:0 Notice: Undefined index: comment_name in C:\wamp\www\imagevoting\index.php on line 18 Call Stack: 0.0013 736584 1. {main}() C:\wamp\www\imagevoting\index.php:0 Notice: Undefined index: comment_text in C:\wamp\www\imagevoting\index.php on line 19 Call Stack: 0.0013 736584 1. {main}() C:\wamp\www\imagevoting\index.php:0 Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\imagevoting\index.php on line 44 Call Stack: 0.0013 736584 1. {main}() C:\wamp\www\imagevoting\index.php:0

Jeg har indsat liner nummer der hvor fejlen er i koden:




<?php
  //load configuration
  require("config.php");
 
  //connect to database
  @mysql_connect($db_server,$db_user) or die("Database server connection failed. Check variables \$db_server, \$db_user and in config.php");
  @mysql_select_db($db_name) or die("Selecting database failed. Check variable \$db_name in config.php");

  //update votes
(line 10 )  $id = $_POST["id"];
  (line 11)        $vote = $_POST["vote"];
 
  if(isset($id) && isset($vote)){
    @mysql_query("UPDATE $db_table_pictures SET points=points+$vote,votes=votes+1 WHERE id=$id;");
  }

  //store comment
(line 18)  $comment_name = $_POST["comment_name"];
(line 19)  $comment_text = $_POST["comment_text"];
 
  if(isset($comment_name) && isset($comment_text) && strlen($comment_name)>2 && strlen($comment_text)>2){
    $comment_name = str_replace("<","&lt;",$comment_name);
    $comment_name = str_replace(">","&gt;",$comment_name);
    $comment_name = stripslashes($comment_name);

    $comment_text = str_replace("<","&lt;",$comment_text);
    $comment_text = str_replace(">","&gt;",$comment_text);
    $comment_text = stripslashes($comment_text);

    @mysql_query("INSERT INTO com (id_pic,name,text,date) VALUES({$_POST["show"]},'$comment_name','$comment_text',".time().");");
  }

  //image to be displayed
  if(!isset($_GET["show"]) && !isset($_POST["show"])){
    //random image
    $ids = array();
    $result = @mysql_query("SELECT id FROM $db_table_pictures;");
    list($min) = @mysql_fetch_row(@mysql_query("SELECT id FROM $db_table_pictures WHERE id>1 ORDER BY id ASC;"));
    list($max) = @mysql_fetch_row(@mysql_query("SELECT id FROM $db_table_pictures WHERE id>1 ORDER BY id DESC;"));
   
    while(list($ids[]) = @mysql_fetch_row($result));
   
    while(true){
( line 44 )    srand((double)microtime()*1000000);
     
      $show = rand($min,$max);
     
      if(array_search($show,$ids)){
        break;
      }
    }
  }else{
    //specific image
    $show = isset($_GET["show"]) ? $_GET["show"] : $_POST["show"];
  }

  $row = @mysql_fetch_array(@mysql_query("SELECT * FROM $db_table_pictures WHERE id=$show;"));
  list($next) = @mysql_fetch_row(@mysql_query("SELECT id FROM $db_table_pictures WHERE id>$show ORDER BY id ASC LIMIT 0,1;"));

  //calculate points
  if($row["points"] != 0){
    $row["points"] = number_format($row["points"]/$row["votes"],2,".","");
  }

  //next image
  if(!$next){
    list($next) = @mysql_fetch_row(@mysql_query("SELECT id FROM $db_table_pictures WHERE id>1 ORDER BY id ASC LIMIT 0,1;"));
  }
 
  //print header
  echo $header;
 
  //print html
          ?><form action="index.php" method="post">
            <table align="center" border="0" cellpadding="2" cellspacing="0">
              <tr>
                <td rowspan="2">awful</td>
                <td rowspan="2" width="10">&nbsp;</td><?php

  //voting form
  for($i=1;$i<=$max_points;$i++){
                ?><td align="center"><?php echo $i; ?></td><?php
  }

                ?><td rowspan="2" width="10">&nbsp;</td>
                <td rowspan="2">awesome</td>
              </tr>
              <tr><?php

  for($i=1;$i<=$max_points;$i++){
                ?><td align="center"><input type="radio" name="vote" value="<?php echo $i; ?>" onclick="submit();"></td><?php
  }

              ?></tr>
            </table>
            <input name="show" type="hidden" value="<?php echo $next; ?>">
            <input name="id" type="hidden" value="<?php echo $row["id"]; ?>">
          </form>
        </td>
      </tr>
      <tr>
        <td colspan="2" height="8">&nbsp;</td>
      </tr>
      <tr>
        <td align="center" colspan="2" height="<?php echo $img_height; ?>"><img alt="" border="0" src="<?php echo $img.$show.$img_format_info; ?>"></td>
      </tr>
      <tr>
        <td colspan="2" height="10">&nbsp;</td>
      </tr>
      <tr>
        <td valign="top" width="50%">Image from <b><?php echo $row["creator"]; ?></b><br><br><?php echo $row["comment"]; ?><br><br></td>
        <td align="right" valign="top" width="50%">Points: <b><?php echo $row["points"]; ?></b> (<?php echo $row["votes"]; ?> votes)<br><br></td>
      </tr>
      <td colspan="2">
        <hr><?php

  $result = @mysql_query("SELECT * FROM com WHERE id_pic={$row["id"]} ORDER BY date DESC;");

  if(@mysql_num_rows($result) == 0){
    ?>No comments<?php
  }else{
    while($row = @mysql_fetch_array($result)){
        ?><b><?php echo $row["name"]; ?></b> wrote on <?php echo date("m/d/Y",$row["date"]); ?> at <?php echo date("h:i a",$row["date"]); ?>:<br>
        <?php echo $row["text"]; ?>
        <br><br><?php
    }
  }

        ?><hr>
        <b>Write a comment:</b>
        <form action="index.php" method="post">
          <table align="center" border="0" cellpadding="5" cellspacing="0">
            <tr>
              <td>Your name:</td>
              <td><input maxlength="50" name="comment_name" size="30" type="text"></td>
            </tr>
            <tr>
              <td valign="top">Comment:</td>
              <td><textarea cols="70" name="comment_text" onkeyup="this.value=this.value.slice(0,<?php echo $comment_size; ?>);" rows="6"></textarea></td>
            </tr>
            <tr>
              <td>&nbsp;</td>
              <td><input type="submit" value="Submit"></td>
            </tr>
          </table>
          <input name="show" type="hidden" value="<?php echo $show; ?>">
        </form><?php
 
  //print footer
  echo $footer;

  //close database connection
  @mysql_close();
?>
Avatar billede olebole Juniormester
30. december 2011 - 20:48 #1
<ole>

Den fejl får du, hvis dokumentet tilgås uden post variabler - eller hvis $_POST['id'] ikke er sat:


if (!empty($_POST)) {
    // Al din kode, der har med en post at gøre
}


/mvh
</bole>
Avatar billede jakobdo Ekspert
30. december 2011 - 21:40 #2
eller:
if (isset($_POST)) {
    // Al din kode, der har med en post at gøre
}
Avatar billede olebole Juniormester
30. december 2011 - 21:54 #3
@Jakob: Nej, den betingelse vil atid være opfyldt. Dette udløser en fejl, hvis der ikke postes mod dokumentet:

if (isset($_POST)) {
    print $_POST['id'];
}

Det gør dette ikke:

if (!empty($_POST)) {
    print $_POST['id'];
}
Avatar billede olebole Juniormester
30. december 2011 - 21:55 #4
Variablerne $_POST og $_GET er altid sat - men de kan være tomme  *o)
Avatar billede olebole Juniormester
30. december 2011 - 21:59 #5
Men dette kan til gengæld give ret god mening, hvis $_POST['id'] ikke altid er sat, når der postes:

if (!empty($_POST)) {
    $id = '';
    if (isset($_POST['id'])) $id = $_POST['id'];
    print $id; // Eller gøre noget andet med $id
}
Avatar billede jakobdo Ekspert
30. december 2011 - 22:00 #6
Olebole: Du har sgu ret. :o) Man kunne vel evt. gøre det på:

if(isset($_POST['SUBMIT_KNAPPENS_NAVN']))

Men empty er måske mere oplagt ja.
Så blev jeg sgu klogere igen i dag. :o)
Avatar billede olebole Juniormester
30. december 2011 - 22:46 #7
Ja, sådan kan du altid spørge. $_POST ved vi, er sat - så derfor er det helt legalt at spørge på et bestemt indeks med isset.

Når jeg selv har et dokument, der kan loades med og uden $_POST/$_GET variabler, bruger jeg som regel empty til at isolere kode, som kun skal afvikles, hvis der er variabler til stede - og isset på de enkelte variabler/indeks
Avatar billede DeeDawg Nybegynder
31. december 2011 - 09:37 #8
Vi mangler stadigvæk at få løst dit sidste problem.

Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\imagevoting\index.php on line 44 Call Stack: 0.0013 736584 1. {main}() C:\wamp\www\imagevoting\index.php:0

At din fejl opstår netop her, betyder at dit loop kører uendeligt, fordi din ID søgning herunder, aldrig stopper.

if(array_search($show,$ids)){
    break;
}

Fejlen starter her:

$result = @mysql_query("SELECT id FROM $db_table_pictures;");

Der er et eller andet galt her, men jeg kan ikke fortælle dig hvad. Enten så eksisterer variablen $db_table_pictures ikke eller tabellen som den angiver, eller også så eksisterer feltet id ikke i den tabel. Det må du jo lige finde ud af.

Du kan jo evt. ændre det til:

$result = mysql_query("SELECT id FROM $db_table_pictures;") or die(mysql_error());

Derudover kan jeg informere dig om, at disse 2 linjer, altid vil give fejl:

list($min) = @mysql_fetch_row(@mysql_query("SELECT id FROM $db_table_pictures WHERE id>1 ORDER BY id ASC;"));
list($max) = @mysql_fetch_row(@mysql_query("SELECT id FROM $db_table_pictures WHERE id>1 ORDER BY id DESC;"));

Funktionen mysql_fetch_row() forventer at modtage en resource variabel, og du kan derfor ikke give et MySQL query kald, direkte. Du er nødt til at gøre således:

$min_result = @mysql_query("SELECT id FROM $db_table_pictures WHERE id>1 ORDER BY id ASC;");
$max_result = @mysql_query("SELECT id FROM $db_table_pictures WHERE id>1 ORDER BY id DESC;");
list($min) = @mysql_fetch_row($min_result);
list($max) = @mysql_fetch_row($max_result);
Avatar billede djsteiner Nybegynder
31. december 2011 - 14:33 #9
Hej alle som har hjulpet mig her i denne tråd tak hjælpen jeg vil arbejde videre med det i det nye år :)

Godt nytår til jer! :)
Avatar billede olebole Juniormester
31. december 2011 - 14:37 #10
@DeeDawg: Du tager fejl!

"Derudover kan jeg informere dig om, at disse 2 linjer, altid vil give fejl: [...] Funktionen mysql_fetch_row() forventer at modtage en resource variabel, og du kan derfor ikke give et MySQL query kald, direkte."

- og en ressource er lige præcis, hvad query'en returnerer til mysql_fetch_row, hvorfor der intet er galt med spørgerens kode i denne forbindelse. Spørgeren er derfor ikke nødt til at gøre andet.

Lad os nu lige få rettet de reelle fejl. Lad os derefter se, hvad der sker  *o)
Avatar billede DeeDawg Nybegynder
01. januar 2012 - 02:26 #11
Hm, du har selvfølgelig ret, olebole. Lod som sådan bare mærke til at den altid gav fejl, da jeg testede det af. Og grundet at jeg altid selv laver det med variabler, så tog jeg en forhastet konklusion.

Efter en genstart af computeren, så virker det selvfølgelig som det skal. ;)
Avatar billede olebole Juniormester
01. januar 2012 - 17:10 #12
Sorry, men nu har jeg for Gud ved hvilken gang modtaget en mail, der citerer en kommentar i denne tråd, som jeg ikke kan se. Jeg har nu logget ud - lukket browseren - og logget ind igen ... #10 er stadig seneste kommentar, jeg kan se! Erfaringen siger, jeg er nødt til selv at skrive denne kommentar for at komme til at se evt. efterfølgende kommentarer!  :o|
Avatar billede olebole Juniormester
01. januar 2012 - 17:16 #13
Se, det hjalp! Hvorfor er der dog ingen blandt Ekspertens personale, der kan finde ud af at kode ... alternativt kan ansætte en professionel til at reparere på sitets kamp-elendige kode ...?!??!!!

Er der for pokker ikke en eller anden behjertet sjæl, som kan prøve at reboote Admin - eller evt. finde en opdateret erstatning, der kan bruges til noget fornuftigt?
Avatar billede djsteiner Nybegynder
23. januar 2012 - 20:14 #14
Hej alle jeg har fået det til at virke :)

Men nu ved så ikke hvem der skal have point ?
Avatar billede olebole Juniormester
24. januar 2012 - 13:21 #15
Jeg samler ikke point, men tak for tilbudet  =)
Avatar billede djsteiner Nybegynder
24. januar 2012 - 14:29 #16
Lukke tid
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