【发布时间】:2013-02-18 01:10:54
【问题描述】:
bind_param 遇到了这个问题,但我不知道出了什么问题:
<?php
$mysqli = new mysqli("$host","$user","$pass","$db");
if(isset($_GET['catName'])) {
$category = "%" . $_GET['catName'] . "%";
}
//setup query
$catSearch = $mysqli->stmt_init();
//search values
$catQuery = "SELECT lister_id,
logo_file_name,
listing_name,
street_address,
city,
state,
zip
FROM listers
INNER JOIN listings
ON listers.lister_id = listings.lister_id
WHERE listings.listing_category LIKE ?";
$catSearch->prepare($catQuery);
$catSearch->bind_param('s', $category);
$catSearch->bind_result($id, $imgfile, $name, $address, $city, $state, $zip);
$catSearch->execute();
$catSearch->store_result();
$mainRows = $catSearch->num_rows();
?>
我得到的警告是:
Warning: mysqli_stmt::bind_param(): invalid object or resource mysqli_stmt in C:\wamp\www\RP\catSearch.php on line 29
让我感到沮丧的是,这种精确的语法将 7 或 8 个其他文档放在一起,就像它一样,但由于某种原因,这个语法一直在中断。我检查了每张桌子,它们都很好(这是上次发生这种情况的问题)。我确保我在其他所有事情之前就声明了我的stmt_init()(之前也有过问题)。我在整张纸上都印有 echo $_GET['catName'],所以它通过了(曾经也有问题)。
另外,一个更元的问题,但有人告诉我使用 bind_param 是防止 SQL 注入的最佳方法;这真的是我需要的所有安全吗? (我的意思是,在合理的范围内,我确信安全性更高,但这是一个小型黄页类型的网站。
【问题讨论】:
-
echo $mysqli->error告诉你什么? -
我不熟悉
mysqli,因为我更喜欢PDO,但是你不应该使用从prepare返回的对象作为stmt对象吗? -
@ExplosionPills 如果你先调用
stmt_init(),不,这是正确的方法。不过,它似乎并不经常使用。 -
@MichaelBerkowski,什么都没有;在这些文件中,我使用一个带有我的连接凭据的文件作为 require_once,并且 if ($mysqli->connect_errno) { echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " 。 $mysqli->连接错误; } 是其中的一部分。没有连接错误,另一个与此完全相同的文件可以很好地提取信息。
-
@MDWar 但是你在
prepare()之后打电话给$mysqli->error吗?另外,你有理由使用stmt_init()吗?你可以只做$catSearch = $mysqli->prepare($catQuery);然后检查if (!$catSearch) echo $mysqli->error;
标签: php mysql sqlbindparameter