Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Suchmaschine "Parse error: syntax error, unexpected '$query' (T_VARIAB

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP Suchmaschine "Parse error: syntax error, unexpected '$query' (T_VARIAB

    Hallo miteinander,
    Ich versuche momentan mithilfe von PHP und MySQL eine Suchmaschine für meine Webseite zu programmieren. Anbei könnt ihr nun meine search.php sehen.

    PHP-Code:
    <?php
    require_once('connect.php');
    $keywords $_GET['search'];
    $query mysqli_query($link"SELECT * from search WHERE keywords like '%".$keywords."%' or title like '%".$keywords."%'");
    echo 
    'Ihre Suche nach <i>'.$keywords.'</i> ergab:<br/>';
      while(
    $d mysqli_fetch_assoc(mysqli_result $query)) {
            echo 
    '<fieldset><legend><a href="http://bla.com/projects/seite/'.$d['link'].'">'.$d['title'].'</a></legend>'.$d['description'].'</fieldset>';
        }
    ?>
    Mein Browser gibt mir nun bei diesem Script in der Zeile 6 einen parse error. Die $query Variable sei nicht erwartet.

    Hier die vollständige Fehlermeldung:

    Parse error: syntax error, unexpected '$query' (T_VARIABLE) in /xx/xxx/search.php on line 6

    Ich habe bereits meine connect.php mithilfe von
    PHP-Code:
    error_reporting(-1);
    ini_set('display_errors'true); 
    debuggt. Hier der Code der connect.php:
    PHP-Code:
    <?php
    $hs 
    "bla";
    $us "bla";
    $ps "bla";
    $db "bla";
    $link mysqli_connect($hs$us$ps);
    mysqli_select_db($link$db);
    ?>
    Vielen Dank im Voraus

  • hausl
    antwortet
    Auf Befehle reagiert die Suchmaschine, denke ich, nicht (getestet mit test $(sleep 4)).
    Was meinst du damit?

    PHP-Code:
    echo 'Ihre Suche nach <i>'.$_POST['search'].'</i> ergab:<br/>'
    Da gehört auf jeden Fall mindestens noch ein htmlspecailchars() rein.

    Siehe auch:
    http://php-de.github.io/jumpto/kontextwechsel/
    http://php-de.github.io/jumpto/sicherheit/

    LG

    Einen Kommentar schreiben:


  • Joma
    antwortet
    PHP-Code:
    <?php
        
    include("connect.php"); 
        
    $keywords strtolower($_POST['search']);
                   
                   if (isset(
    $keywords) && $keywords !="") {
                             
                    
    $stmt mysqli_stmt_init($link);
                    
    mysqli_stmt_prepare($stmt'SELECT title, keywords, link, description from search WHERE title like ? or keywords like ?');
                    
    $keywords_temp "%".$keywords."%";
                    
    mysqli_stmt_bind_param($stmt"ss"$keywords_temp,$keywords_temp);
                    
    mysqli_stmt_execute($stmt);                
                    
                    echo 
    'Ihre Suche nach <i>'.$_POST['search'].'</i> ergab:<br/>';
                    
    $query_exists false;
                    
    mysqli_stmt_bind_result($stmt,$db_title$db_keywords$db_link$db_description);
                    
    $displayed_links "";
                    while(
    mysqli_stmt_fetch($stmt)) {
                    
    $db_keywords strtolower($db_keywords);
                    
    $db_keywords preg_split("#,#",$db_keywords);
                    for(
    $i 0; isset($db_keywords[$i]); $i++) {
                    if(
    $db_keywords[$i] == $keywords) {
                    
    $query_exists true;
                    echo 
    "<br />";
                    echo 
    "<a class=\"title\" href=\"".$db_link."\">".$db_title."</a> <br /> <p>".$db_description."</p>";
                    
    $displayed_links .= $db_link;
                    break;
                    }
                    }
                    
    $db_title_array strtolower($db_title);
                    
    $db_title_array preg_split("# #",$db_title_array);
                    for(
    $i 0; isset($db_title_array[$i]); $i++) {
                    if(
    $db_title_array[$i] == $keywords && preg_match("#".$db_link."#",$displayed_links) == 0) {
                    
    $query_exists true;
                    
                    echo 
    "<br />";
                    echo 
    "<a class=\"title\" href=\"".$db_link."\">".$db_title."</a> <br /> <p>".$db_description."</p>";
                    break;
                    }
                    }
                    }
                    if(!
    $query_exists) {
                    echo 
    "<br /> Es wurden keine &Uuml;bereinstimmungen gefunden.";
                    }
                    }
                    else {
                    echo 
    '<br/> Es wurde kein Suchbegriff eingegeben. <br /><br />'
                    }
                    
                    
    mysqli_stmt_close($stmt);
                    
    mysqli_close($link);
                    
    ?>
    Habe ich die prepared Statements Methode nun richtig angewendet? Ich habe keine Fehler mehr, die Suche funktioniert einwandfrei. Auf Befehle reagiert die Suchmaschine, denke ich, nicht (getestet mit test $(sleep 4)).

    Einen Kommentar schreiben:


  • hausl
    antwortet
    genau, und daher wird

    PHP-Code:
    $stmt mysqli_prepare($link$query); 
    dein $stmt false sein. Frag doch mal mysqli_error() danach ab http://php.net/manual/de/mysqli.error.php das sagt dir dann auch wo der Schuh drückt.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    is wohl das stament falsch.
    poste doch mal $query, oder lass dir fehler ausgeben?

    http://php.net/manual/en/mysqli.quic...statements.php

    http://php.net/manual/de/mysqli.error.php

    Einen Kommentar schreiben:


  • Joma
    antwortet
    Ich habe nun folgende Fehler:

    Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given

    Warning: mysqli_stmt_execute() expects parameter 1 to be mysqli_stmt, boolean given

    Warning: mysqli_stmt_close() expects parameter 1 to be mysqli_stmt, boolean given

    Warning: mysqli_fetch_object() expects parameter 1 to be mysqli_result, boolean given

    Einen Kommentar schreiben:


  • Joma
    antwortet
    Zitat von moma Beitrag anzeigen
    http://php.net/manual/de/mysqli.prepare.php

    beispiel #1

    achja, bitte nicht objectorientierten und prozeduralen stil mischen....
    Danke, habe den Code soweit geändert:

    PHP-Code:
    $stmt mysqli_prepare($link$query);
    mysqli_stmt_bind_param($stmt's'$_POST['search']);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
    mysqli_close($link);

    /* und in der connect.php */

    $link mysqli_connect($hs$us$ps$db) or die("Keine Verbindung"); 

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    http://php.net/manual/de/mysqli.prepare.php

    beispiel #1

    achja, bitte nicht objectorientierten und prozeduralen stil mischen....

    Einen Kommentar schreiben:


  • Joma
    antwortet
    So hier einmal ein kleines Update meinerseits:

    Ich habe den Code nun soweit fertiggestellt, dass er in der Datenbank sucht und Ergebnisse ausgibt. Allerdings habe ich bei den prepared_statements, dass Problem, dass der Code folgenden Fehler anzeigt:

    Fatal error: Call to a member function bind_param() on a non-object

    Ohne die prepared statements funktioniert der Code, allerdings wäre ich naiv auf diese zu verzichten.

    Hier mein Code:

    search.php

    PHP-Code:
    <?php
        
    include('connect.php');
        
    $keywords $_POST['search'];
                   
                   if (isset(
    $keywords) && $keywords !="") { 
                   
    $query mysqli_query($link"SELECT 'title' , 'keywords' from search WHERE keywords like keywords=? or title like keywords=?");
                    
                    
    $stmt $link->prepare($query);
                    
    $stmt->bind_param('s'$_POST['search']);
                    
    $stmt->execute();
                    
    $stmt->close();
                    
                    echo 
    'Ihre Suche nach <i>'.$keywords.'</i> ergab:<br/>';
                    
    $query_exists false;
                    while(
    $row mysqli_fetch_object($query)) {
                    
    $keywords_from_db $row->keywords;
                    
    $keywords_from_db preg_split("#,#",$keywords_from_db);
                    for(
    $i 0; isset($keywords_from_db[$i]); $i++) {
                    if(
    $keywords_from_db[$i] == $keywords) {
                    
    $query_exists true;
                    echo 
    "<br />";    
                    echo 
    "<a class=\"title\" href=\"".$row->link."\">".$row->title."</a> <br /> <p>".$row->description."</p>";
                    break;
                    }
                    }
                    }
                    if(!
    $query_exists) {
                    echo 
    "<br /> Es wurden keine &Uuml;bereinstimmungen gefunden.";
                    }
                    }
                    else {
                    echo 
    '<br/> Es wurde kein Suchbegriff eingegeben. <br /><br />'
                    }
    ?>
    connect.php

    PHP-Code:

    $hs 
    "Hostadresse";
    $us "Username";
    $ps "Passwort";
    $db "Datenbank";

    $link = new mysqli($hs$us$ps$db) or die("Keine Verbindung"); 
    Danke im Voraus!

    EDIT:
    Ich habe noch aus

    PHP-Code:
    $query mysqli_query($link"SELECT * from search WHERE keywords like keywords=? or title like keywords=?"); 
    PHP-Code:
    $query mysqli_query($link"SELECT 'title' , 'keywords' from search WHERE keywords like keywords=? or title like keywords=?"); 
    gemacht.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    keywords werden sowieso nicht zufriedenstellen funktionieren. Der Suchende müsste dann exakt die Reihenfolge der Wörter wie in der Datenbank eingeben.

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Zitat von Joma Beitrag anzeigen
    PHP-Code:
    $keywords $_POST['search'];   
    $keywords mysqli_real_escape_string($link$keywords);
    $query mysqli_query($link"SELECT * from search WHERE keywords like '%".$keywords."%' or title like '%".$keywords."%'"); 
    In der Variante musst du nur ev. vorsichtig sein, wenn du $keywords im späterem Verlauf nochmal benötigst, die Variable ist dann ja "real-escaped". Glaub ich würde in dem Fall (da $keywords in der query 2x vorkommt) eine eigene Variable nur für die query machen. Aber zu aller Erst natürlich Prepared Statements verwenden.

    Was genau an SELECT * ist den pfui?
    http://php-de.github.io/jumpto/code-smells/#select-

    LG

    Einen Kommentar schreiben:


  • VPh
    antwortet
    http://use-the-index-luke.com/blog/2...he-star-stupid
    http://stackoverflow.com/questions/3...idered-harmful

    und mehr, Googlesuche: "select * bad"

    Einen Kommentar schreiben:


  • Joma
    antwortet
    PHP-Code:
    $keywords $_POST['search'];   
    $keywords mysqli_real_escape_string($link$keywords);
    $query mysqli_query($link"SELECT * from search WHERE keywords like '%".$keywords."%' or title like '%".$keywords."%'"); 
    Was genau an SELECT * ist den pfui?

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Gut, ich habe mysqli_real_string(); nun folgendermaßen in die search.php eingebaut:
    Du wendest es zu spät an, du verstehst immer noch nicht warum und was du da machst, oder? Wenn die query mittels mysqli_query(...) an die DB geschickt wird muss es schon escaped worden sein.

    Und SELECT * ist immer noch pfui.

    Einen Kommentar schreiben:


  • Joma
    antwortet
    Gut, ich habe mysqli_real_string(); nun folgendermaßen in die search.php eingebaut:

    PHP-Code:
    <?php
       
        
    require_once('connect.php');
        if (isset(
    $_POST['search'])) { 
                   
    $keywords $_POST['search'];   
                   
    $query mysqli_query($link"SELECT * from search WHERE keywords like '%".$keywords."%' or title like '%".$keywords."%'");
                    echo 
    'Ihre Suche nach <i>'.$keywords.'</i> ergab:<br/>';
                    while(
    $d mysqli_fetch_assoc($query)) {
                        echo 
    '<fieldset><legend><a href="http://x.com/x/x/'.$d['link'].'">'.$d['title'].'</a></legend>'.$d['description'].'</fieldset>';
                        
    $keywords mysqli_real_escape_string($link$keywords);
                      }
                   }
                   else { 
                      echo 
    'Es wurde kein Suchbegriff eingegeben.'
                   }
    ?>
    EDIT: Kann/Brauche ich meine in der connect.php hinterlegten MySQL Zugangsdaten nicht sicherer schützen? Ich muss mich momentan noch in das Thema prepared Statements einarbeiten, ich würde sie dann gerne verwenden.

    Einen Kommentar schreiben:

Lädt...
X