PHP prepared statements. Probleme mit mysqli_prepare();

RageComics

Cadet 2nd Year
Registriert
Juli 2012
Beiträge
31
Hallo miteinander!

Ich habe mir gestern Abend ein Video über MySQL Injections angeguckt. https://www.youtube.com/watch?v=GFvEAbqTREM
Nachdem ich einen Schreck bekommen habe, beschloss ich prepared statements in meine Suchmaschine zu implementieren.

Hier mein Code:

PHP:
<?php
     include('connect.php');
    $keywords = $_POST['search'];
               
               if (isset($keywords) && $keywords !="") { 
                $query = mysqli_query($link, "SELECT 'title' , 'keywords' , 'description' from search WHERE keywords like keywords=? or title like keywords=?");
				$stmt = mysqli_prepare($link, $query);
				mysqli_stmt_bind_param($stmt, 's', $_POST['search']);
				mysqli_stmt_execute($stmt);
				mysqli_stmt_close($stmt);
				mysqli_close($link);
				
                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
$hs = "*";
$us = "*";
$ps = "*";
$db = "*";

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

?>

Jetzt habe ich leider mehrere Fehler, die besagen, dass ein Parameter namens mysqli_stmt fehlt. Bin gerade ein bisschen ratlos, zudem ein Freund von mir auch gesagt hat, ich hätte objektorientierten und prozedualen Stil durcheinandergeworfen :(

Ich würde mich freuen, wenn mir da jemand weiterhelfen könnte.

EDIT:
Ist es sinnvoll neben der prepared statements Methode auch mysqli_real_escape_string(); zu verwenden?
 
Zuletzt bearbeitet:
Prepared Statements sorgen dafür, dass kein Escaping nötig ist.

Aber hier gibts noch andere Unklarheiten...
1.) Dein Query String sieht total eigenartig aus. keywords like keywords=? sieht SOWAS von falsch aus...
2.) mysqli_stmt_bind_param($stmt, 's', $_POST['search']); <- Ich möcht wetten, dass hier ein 2. "s" sowie ein 2. $_POST['search'] fehlen, denn du hast ja 2 Platzhalter in deinem Query String.

Und insgesamt: Auch wenn mysqli durchaus brauchbar ist, PDO ist die bessere Lösung, da du hier nicht fest an ein Datenbanksystem gebunden bist.
 
Ich habe PDO bisher nie benutzt. Ist das zwingend notwendig?

mysqli_stmt_bind_param($stmt, 'ss', $_POST['search'], $_POST['search']);
Habe das jetzt so ergänzt.
Ergänzung ()

Müsste dann die prepared statement Methode vor der Query Abfrage stattfinden?
 
Zuletzt bearbeitet:
Zurück
Oben