2016-05-24 6 views
-1

EDITED: mit neuem Code nach Hilfe von Sgt AJ.Wie kann eine Funktion mit Datenbankdaten in einer anderen Funktion aufgerufen werden?

Ok, also lerne ich die ganze Zeit, aber seit mein Programmierer die Programmierung für unsere Website eingestellt hat, muss ich PHP jetzt selbstständig lernen.

Und ich sehe die ganze Zeit die Codierung, wo mein Coder Funktionsaufrufe innerhalb anderer Funktionsaufrufe machte.

Also zuerst das Setup, wir haben eine Datei für ziemlich 95% aller Funktionen auf unserer Website. Diese Funktionsdatei hat im Grunde ungefähr 40-50 Funktionen.

Also frage ich, ob mir jemand erklären kann, wie das möglich ist, um eine Funktion in einem anderen zu nennen, die in der folgenden Instanz funktioniert, aber wenn ich versuche, es zu replizieren, funktioniert es nicht? zeigt keine Daten an, wenn ich versuche, die $user_info zu echo?

Wie zum Beispiel diese Funktion unten: So Sgt AJ half mir, das Benutzeravatar-Problem zu lösen, so dass aus dieser Frage entfernt wird!

function showComments($v) 
    { 
     $mysqli = db_connect(); 
     $v = mysqli_real_escape_string($mysqli,$v); 
     $sql = "SELECT * FROM `cl45-tbn_dir`.`comments` WHERE `v` = ? ORDER BY `id` ASC"; 
     $stmt = $mysqli->prepare($sql); 
     $stmt->bind_param("s",$v); 
     $stmt->execute(); 
     $result = $stmt->get_result(); 

     while ($myrow = $result->fetch_assoc()) { 
      if ($myrow['post_approved']==1){ 
       $user_info = getUserInfo($myrow['poster_id']); 

       if ($user_info['user_avatar_type']==1) { 
        $avatar = "https://www.tubenations.com/forum/download/file.php?avatar=".$user_info['user_avatar']; 
       } else { 
        $avatar = "https://www.tubenations.com/forum/styles/Flato%20-%20LightBlue%20-%20Main%20Style/theme/images/no_avatar.gif"; 
       } 

       echo '<div class="comment"> 
        <div class="avatar"> 
         <a href="https://www.tubenations.com/users.php?id='.$myrow['poster_id'].'"> 
          <img src="'.$avatar.'" /> 
        </div> 

        <div class="name"><a class ="myaccount'.$user_info['group_id'].'" href="https://www.tubenations.com/users.php?id='.$myrow['poster_id'].'">'.$user_info['username'].'</a></div> 
        <div class="date" title="report this post">'.date("d M Y",$myrow['post_time']).'<form action="" class="flag" method="post"><button type="submit" value="'.$myrow['id'].'" name="vote" id="votebutton" alt="vote"><img src="/images/flag.png" alt="report this post!" /></button></form></div> 
        <p>'.stripslashesFull(clean($myrow['post_text'])).'</p> 
       </div>'; 
      } 
     } 

     $stmt->close(); 
     $mysqli->close(); 
    } 

Wie Sie sehen können, gibt es eine Zeile, wo es eine andere Funktion getUserInfo, $user_info = getUserInfo($myrow['poster_id']); aufruft, die eine andere Funktion in dieser Datei ist, und das verbindet grundsätzlich zu unserem Forum Datenbank und erhält Daten.

Aber wenn ich versuche, diese Methode zu replizieren, indem Sie diese Art von Anruf in einem anderen verwenden, funktioniert es nicht.

Also im Grunde, was ich versuche, mit zu spielen versuchen, mit dieser unter Funktion

function getYouTubeInfo($page) 
      { 
       #$id = $_GET['id']; 

       print_r ($userdata['user_id']); 
       echo $myrow['user_id']; 
       echo $userdata['user_id']; 

       $db_link = mysqli_connect ('localhost', 'HIDDEN', 'HIDDEN', 'HIDDEN'); 

        if (!$db_link) 
{ 
    die('following error occured: '.mysqli_error()); 
} 

$query = "SELECT user_id, yt_channelTitle, channel_id FROM points WHERE channel_id IS NOT NULL AND yt_channelTitle IS NOT NULL ORDER BY channel_id DESC;"; 
if($result = mysqli_query($db_link, $query)){ 
    echo ""; 

    $i = -1; 
    $objectsPerPage = 14; 
    $show_records = FALSE; 
    while ($row = $result->fetch_assoc()) 
      { 

      if (!isset($_SESSION['last_slide'])) { $_SESSION['last_slide'] = $row['channel_id']; } 

       if ($row['channel_id'] == $_SESSION['last_slide']) { $show_records = TRUE; } 

         if ($show_records) 
         { 
         $i = $i+1; 

         if ($i > $objectsPerPage) { $_SESSION['last_slide'] = $row['channel_id']; echo 'BREAK: ', $row['channel_id']; break; } 

         $page = abs(floor($i/$objectsPerPage)); 
         $youtube_info = $row; 
         $userdata = getUserInfo($row['user_id']); 

           if ($userdata['user_avatar_type']==1) { 
            $avatar = "/forum/download/file.php?avatar=".$userdata['user_avatar']; 
           } else { 
            $avatar = "/images/no_image.png"; 
           } 

           if (($i/$objectsPerPage)==$page) 
           { 
           if ($page !=0) { 
           echo "</div></div>"; 
           } 
           echo '<div class="cslide-slide"> 
           <div class="slideTitles">Youtube Users Slide '.$page.'</div> 
           <div class="sections grouped">'; 
           } 
        echo ' 
           <div class="cols span_1_of_2">  
          <div class="memberTitles"><a href="/user/'.$youtube_info['user_id'].'">'.$youtube_info['yt_channelTitle'].'</a>'.$i.';</div> 
            <div class="memberPicture"><img src="'.$avatar.'" title="Tube Nations Profile Picture" alt="Tube Nations Profile Picture"/></div> 
            <div class="memberTwitter"><div class="g-ytsubscribe" data-channelid="'.$youtube_info['channel_id'].'" data-layout="full" data-count="default" data-onytevent="onYtEvent"></div></div> 
           </div> '; 

         } 
      } 

    echo '</div></div>'; 
} 
    mysqli_free_result($result); 
echo $_SESSION['last_slide']; 
session_destroy(); 
mysqli_close($db_link); 

} 

Also im Grunde auf der Seite in Frage eine Funktion zur Anzeige X-Benutzer-Daten zu machen, youtube.php, ich echo gerade diese getYouTubeInfo Funktion.

Diese Funktion muss ich versuchen, die Benutzerprofilbilder zu erhalten, die in der Forumdatenbank sind, die von der getUserInfo($id) stammt.

Auch auf Seite beachten, ich kann auch nicht herausfinden, wie die $i und $objectsPerPage Variablen neu ordnen und if-Anweisungen, damit ich dann die $page in der Abfrage LIMIT $page; weil zur Zeit der Seite Abstürze ohne Limit verwenden kann, also musste ich für jetzt auf 16 begrenzen.

Ich benutze ein jQuery-Slide-Skript zur Anzeige von X pro Folie, also wenn ich irgendwie herausfinden kann, wie man die Abfrage weiter unten nach den Variablen und if Anweisungen für die Seite stopft oder Hilfe bekommt, würde ich es begrüßen .

AKTUALISIERTE ANTWORT BEARBEITEN: Das Problem ist nun, dass X pro Folie/Seite angezeigt wird, aber es wird jetzt eine Lücke angezeigt, nachdem 8 Ergebnisse angezeigt werden, aber mit einer Lücke und dann auf der nächsten Folie Schaltfläche wird nicht angezeigt? Also sagte Sgt AJ, dass wir es irgendwie mit der Jquery verbinden müssen, also werde ich jetzt ein Tag für jquery hinzufügen. (Aber kann ich ein großes Dankeschön an Sgt AJ für seine Hilfe sagen, wirklich zu schätzen) :)

+0

BTW, wollte ich gestern etwas dazu sagen: Die Zeile 'if (! $ Db_link) { die ('folgende Fehler aufgetreten:' .mysqli_error()); } 'ist sehr schlechte Programmierpraxis für eine Live-Site. Wenn bei der Anzeige der Seite ein Fehler auftritt, werden durch den Fehler potenziell gefährliche Informationen zu Ihrem Code und/oder Datenbankschema einem Benutzer angezeigt, der ihn nicht haben sollte. Sie sollten Benutzern einen allgemeinen Fehler zeigen und den tatsächlichen Fehler irgendwo aufzeichnen, wo Sie später nachschlagen können. –

+0

ok ja, nur ein paar meiner Funktionen, die ich gemacht habe, sind auf diese Weise gemacht, Die meisten Funktionen in der Datei Funktionen sind alle in der Regel vorbereitete Anweisungen. –

+0

Auch @Sgt AJ, bemerkte ich etwas seltsames, das geschah, wenn Sie den neuen Antwort-Post gelesen ich mit den Details gepostet :) –

Antwort

1

Wow, du hast hier einige Dinge vor sich.

Zuerst sagt Ihre Abfrage jetzt LIMIT 0;, was bedeutet, dass Sie Null Zeilen zurückgegeben sollten. Erhalten Sie Daten von dieser Abfrage zurück?

Zweitens, um die Seite und pro Seite zu bekommen richtig funktioniert, könnte man mit etwas so gehen:

  1. In der Schleife, halten Sie Ihre i=i+1 Linie
  2. hinzufügen diese Option, wenn:

if ($i == $objectsPerPage)
{
++$page;
i = 1;
}

Dadurch wird der Seitenzähler erhöhen, sobald die Seite voll ist, dann setzen Sie den Punkt für die nächste Seite zählen.

+0

BTW, kann mir jemand sagen, warum manchmal die Seite weigert, einen Code-Block anzeigen, zwingt mich zu formatieren so was? –

+0

Ok, aber zuerst kann ich antworten, warum ich 0 in 'LIMIT 0' gesetzt habe; es war, die Seite anzuhalten, externe Anrufe an youtube zu machen, während ich versuchte herauszufinden, warum ich keine Daten von der 'getUserInfo ($ id)' Funktion. Ich werde versuchen, was Sie mit der neuen if-Anweisung gesagt haben, aber wird das stoppen die ganzen Daten geladen werden? weil das ist, warum die Seite im Moment abstürzt, weil es versucht, youtube für über 300 Benutzerdaten lol zu fragen. –

+0

Wo ändern Sie die Variable $ user_info? Es sieht so aus, als würde ich immer die gleichen Benutzerinformationen anfordern, basierend auf dem Code, den ich sehe. Abgesehen von diesem Problem sollten Sie, wenn Sie die Abfrage auf "LIMIT 1" setzen, nur jeweils 1 Benutzerdaten aus der Abfrage zu Testzwecken anfordern. (es sei denn, diese Funktion wird von irgendwo anders wiederholt) –

0

Ich wollte nur mehr auf meine Frage an, ich glaube, jetzt die Antwort mit AJAX ist, so dass ich glaube, ich brauche irgendwie den cSchieben jQuery-Code machen erinnert an die getYoutubeInfo($page) Funktion

der Jquery-Code für das cSchieben ist dies:

(function($) { 

    $.fn.cslide = function() { 

     this.each(function() { 

      var slidesContainerId = "#"+($(this).attr("id")); 

      var len = $(slidesContainerId+" .cslide-slide").size();  // get number of slides 
      var slidesContainerWidth = len*100+"%";      // get width of the slide container 
      var slideWidth = (100/len)+"%";        // get width of the slides 

      // set slide container width 
      $(slidesContainerId+" .cslide-slides-container").css({ 
       width : slidesContainerWidth, 
       visibility : "visible" 
      }); 

      // set slide width 
      $(".cslide-slide").css({ 
       width : slideWidth 
      }); 

      // add correct classes to first and last slide 
      $(slidesContainerId+" .cslide-slides-container .cslide-slide").last().addClass("cslide-last"); 
      $(slidesContainerId+" .cslide-slides-container .cslide-slide").first().addClass("cslide-first cslide-active"); 

      // initially disable the previous arrow cuz we start on the first slide 
      $(slidesContainerId+" .cslide-prev").addClass("cslide-disabled"); 

      // if first slide is last slide, hide the prev-next navigation 
      if (!$(slidesContainerId+" .cslide-slide.cslide-active.cslide-first").hasClass("cslide-last")) {   
       $(slidesContainerId+" .cslide-prev-next").css({ 
        display : "block" 
       }); 
      } 

      // handle the next clicking functionality 
      $(slidesContainerId+" .cslide-next").click(function(){ 
       var i = $(slidesContainerId+" .cslide-slide.cslide-active").index(); 
       var n = i+1; 
       var slideLeft = "-"+n*100+"%"; 
       if (!$(slidesContainerId+" .cslide-slide.cslide-active").hasClass("cslide-last")) { 
        $(slidesContainerId+" .cslide-slide.cslide-active").removeClass("cslide-active").next(".cslide-slide").addClass("cslide-active"); 
        $(slidesContainerId+" .cslide-slides-container").animate({ 
         marginLeft : slideLeft 
        },250); 
        if ($(slidesContainerId+" .cslide-slide.cslide-active").hasClass("cslide-last")) { 
         $(slidesContainerId+" .cslide-next").addClass("cslide-disabled"); 
        } 
       } 
       if ((!$(slidesContainerId+" .cslide-slide.cslide-active").hasClass("cslide-first")) && $(".cslide-prev").hasClass("cslide-disabled")) { 
        $(slidesContainerId+" .cslide-prev").removeClass("cslide-disabled"); 
       } 
      }); 

      // handle the prev clicking functionality 
      $(slidesContainerId+" .cslide-prev").click(function(){ 
       var i = $(slidesContainerId+" .cslide-slide.cslide-active").index(); 
       var n = i-1; 
       var slideRight = "-"+n*100+"%"; 
       if (!$(slidesContainerId+" .cslide-slide.cslide-active").hasClass("cslide-first")) { 
        $(slidesContainerId+" .cslide-slide.cslide-active").removeClass("cslide-active").prev(".cslide-slide").addClass("cslide-active"); 
        $(slidesContainerId+" .cslide-slides-container").animate({ 
         marginLeft : slideRight 
        },250); 
        if ($(slidesContainerId+" .cslide-slide.cslide-active").hasClass("cslide-first")) { 
         $(slidesContainerId+" .cslide-prev").addClass("cslide-disabled"); 
        } 
       } 
       if ((!$(slidesContainerId+" .cslide-slide.cslide-active").hasClass("cslide-last")) && $(".cslide-next").hasClass("cslide-disabled")) { 
        $(slidesContainerId+" .cslide-next").removeClass("cslide-disabled"); 
       } 
      }); 



     }); 

     // return this for chainability 
     return this; 

    } 

}(jQuery)); 

ich zwickte auch den Code, Sgt AJ mir wieder geholfen, eine session_destroy() kurz vor der schließenden Klammer Durch Zugabe. Und noch ein paar andere Bits, weil ich bemerkt habe, dass wenn Sie die Seite immer wieder aktualisiert haben, nur die nächsten 14 Ergebnisse geladen wurden, anstatt die gleichen 14 Ergebnisse, so dass der eigentliche Code und die Logik funktionieren. Es liegt also im Grunde daran, dass wir einen Weg finden müssen, AJAX zu verwenden und die Funktion aus dem Onclick-Ereignis der nächsten/vorherigen Tasten aufzurufen.

Verwandte Themen