2016-05-14 6 views
0

Ich konvertiere zu Mysqli objektorientiert (oder zu versuchen). Ich habe verschiedene Kategorieseiten. Ich möchte einen Parameter Platzhalter '?' im Include verwenden und dann die richtige Kategorie auf der Kategorieseite aufrufen. Das ist soweit ich habe. Wie gebe ich die Kategorie auf meiner Seite an? Alles funktioniert gut, wenn ich WHERE category = apples angeben.PHP MySQLI Objekt-orientiert mit Wildcard

Ich habe hierfür sind oben eine Kategorie-Seite

<?php require_once 'maincats_mysqli.php' ?> 

, die unten:

<?php 
$db = new mysqli('host', 'userName', '', 'dbName'); 
if ($db->connect_error) { 
    $error = $db->connect_error; 
} else { 
$sql = "SELECT pageName, gImage, prodName, prodPrice 
FROM tableName 
WHERE category = '?' 

ORDER BY dtList DESC"; 

$stmt->bind_param('s', ['$category']); 

$result = $db->query($sql); 
if ($db->error) { 
    $error = $db->error; 
    } 
} 
function getItem($result) { 
return $result->fetch_assoc(); 
    } 
?> 

Unten Teil einer Kategorie-Seite ist. Wie gebe ich an, welche Kategorie? Jede Hilfe wäre willkommen.

<?php 
if (isset($error)) { 
echo "<p>$error</p>"; 
    } 
?> 

<?php 
while ($item = getItem($result)) { 
?> 

<a href="http://www.example.com/<?php echo $item['pageName']; ?>"> 
<img src="http://www.example.com/<?php echo $item['gImage'];  ?>"</a> 
<a href="http://www.example.com/<?php echo $item['pageName']; ?>"> 
<?php echo $item['prodName']; ?></a> 
<?php echo $item['prodPrice']; ?> 

<?php 
    } 
?> 
+1

1) Entfernen Sie einzelne Anführungszeichen von '... category = '?' ... '. 2) Siehe diese Anweisung '$ stmt-> bind_param ('s', ['$ category']);', es sollte '$ stmt-> bind_param ('s', $ category) sein;'. 3) Sie haben ** Ihre vorbereitete Aussage nicht ** ausgeführt. 4) RTM, [http://php.net/manual/de/mysqli.quickstart.prepared-statements.php] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) –

+0

Verwenden Sie keine einfachen Anführungszeichen für Variablen. Siehe auch obige Hinweise ^. Es wird auch ein 'Platzhalter', kein' Platzhalter' genannt. – chris85

+0

Und oh, ich hätte es fast vermisst, du hast deine Anfrage nicht einmal vorbereitet. –

Antwort

2

Zuerst deklarieren Sie nicht $stmt.

Zweitens ist ? in diesem Fall kein Platzhalter, es ist ein Parameter Platzhalter. Sie können solche Platzhalter verwenden, wenn Sie die Abfrage mit $mysqli->prepare($sql) vorbereiten. Siehe Dokumentation: http://php.net/manual/en/mysqli-stmt.bind-param.php

$sql = "SELECT pageName, gImage, prodName, prodPrice 
    FROM tableName 
    WHERE category = ? 
    ORDER BY dtList DESC"; 

$stmt = $db->prepare($sql); 

Drittens einkapseln Sie Ihre Variable in einfache Anführungszeichen, also ist es ein String mit einem Dollar und den Namen Ihrer variablen, nicht ihr Inhalt. Und es muss nicht in einem Array sein:

$stmt->bind_param('s', $category); 

Last: woher kommt $category herkommt? Es ist nicht in dem Skript definiert, das Sie uns zeigen. Ich denke, es ist von $_GET, so dass die vorhergehende Zeile sein soll:

$stmt->bind_param('s', $_GET['category']); 

Schließlich müssen Sie Ihre Anweisung ausführen, die die Abfrage enthält:

$stmt->execute(); 

EDIT:

zu holen Ergebnisse, brauchen Sie nicht, dass getItem() Funktion. Einfach entfernen.

$result = $stmt->get_result(); 

Dann können Sie Schleife über $result und jede Zeile holen:

while ($item = $result->fetch_assoc()): 

// do you stuff 

endwhile; 

Bitte beachte, dass ich hier verwenden die PHP control structure alternative syntax, die deutlicher in Ihrem Fall ist (endwhile ist expliziter als nur })

1

Sie vermissen die prepare(). Schauen Sie sich das erste Beispiel in der PHP manual page:

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$city = "Amersfoort"; 

/* create a prepared statement */ 
$stmt = $mysqli->stmt_init(); 
if ($stmt->prepare("SELECT District FROM City WHERE Name=?")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $city); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($district); 

    /* fetch value */ 
    $stmt->fetch(); 

    printf("%s is in district %s\n", $city, $district); 

    /* close statement */ 
    $stmt->close(); 
} 

/* close connection */ 
$mysqli->close(); 
?> 

Beachten Sie, dass Sie dürfen nicht binded Parameter angeben.

+0

Ich habe eine wirklich harte Zeit damit. Die Information befindet sich bereits in meiner DB-Tabelle. Ich muss nur meine E-Commerce-Site von MySQL zu MySQLi konvertieren. Früher hatte ich auf jeder Produktseite und Kategorieseite "Auswählen", um die benötigten Informationen aufzurufen. Ich dachte, ich könnte Select in ein Include mit MySQLi setzen. Ich habe alle obigen Vorschläge ausprobiert und nichts scheint zu funktionieren. – acvintage