2016-05-14 31 views
0

我正在轉換爲Mysqli面向對象(或試圖)。我有各種分類頁面。我想在包含中使用參數佔位符'?',然後在類別頁面上調用正確的類別。 這是我得到的。如何在我的頁面上指明類別?如果我指出WHERE category = apples,所有工作正常。PHP MySQLI面向對象與通配符

我有這個包括類別頁面

<?php require_once 'maincats_mysqli.php' ?> 

的頂部,低於:

<?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(); 
    } 
?> 

下面是一個分類頁面的一部分。我如何指出哪個類別?任何幫助,將不勝感激。

<?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)從'... category ='?'中刪除單引號...'。 2)看到這個語句'$ stmt-> bind_param('s',['$ category']);',它應該是'$ stmt-> bind_param('s',$ category);'。 3)你沒有**執行你準備好的陳述。 4)RTM,[http://php.net/manual/en/mysqli.quickstart.prepared-statements。php](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) –

+0

不要在變量上使用單引號。另請參閱上面的註釋^。它也被稱爲「佔位符」,而不是「通配符」。 – chris85

+0

哦,我幾乎錯過了,你甚至沒有**準備**你的查詢。 –

回答

2

首先,您不要聲明$stmt

其次,?在這種情況下不是通配符,它​​是一個參數佔位符。在準備查詢時,您可以使用這種佔位符,其編號爲$mysqli->prepare($sql)。見文檔: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); 

第三,你封裝你在單引號中的變量,所以它有一個美元的字符串和您的變量,而不是它的內容的名稱。它不能在一個陣列:

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

最後:$category從哪裏來?它沒有在您向我們展示的腳本中定義。我想這從$_GET的,所以前行應該是:

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

最後,你需要執行的語句,該語句包含查詢:

$stmt->execute(); 

編輯

要取結果,你不需要那個函數。只要刪除它。

$result = $stmt->get_result(); 

然後你可以遍歷$result,並獲取每一行:

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

// do you stuff 

endwhile; 

注意,我在這裏使用的PHP control structure alternative syntax這是你的情況更加清晰(endwhile不僅僅是}更明確)

1

您錯過了prepare()。看看在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(); 
?> 

請注意,你不能引用綁定參數。

+0

我對此很難過。該信息已經在我的數據庫表中。我只需要將我的電子商務網站從MySQL轉換爲MySQLi。我曾在每個產品頁面和類別頁面上都有「選擇」來調出我需要的信息。以爲我可以把選擇包含在MySQLi中。我已經嘗試了以上所有建議,似乎沒有任何工作。 – acvintage