首先,我需要说我已经搜索了超过2小时,但没有找到任何可以帮助我的答案! 所以这是我的问题: 每当我尝试执行该代码时:
if(isset($_GET['name'])){ #Line 65
$name = $_GET['name']; #Line 66
$test = $mysqli->prepare('SELECT * FROM `SkyWars_Stats` WHERE player_uuid = ":name"'); #Line 67
$test->bind_param(array('name' => $name)); #Line 68
$test->execute(); #Line 69
}
我收到此错误:
[Thu Sep 29 18:43:13.035006 2016] [:error] [pid 11506] [客户。。 。 :* ****] PHP警告:第68行/var/www/html/stats/index.php中mysqli_stmt :: bind_param()的参数计数错误
Sooooo我做错了什么?
感谢您的帮助:)
答案 0 :(得分:2)
首先,您在命名占位符中使用引号:
case class Person(name: String, Age: Int, country: String)
// defined class Person
val personList = List(
Person("person_1", 20, "country_1"),
Person("person_2", 30, "country_2")
)
// personList: List[Person] = List(Person(person_1,20,country_1), Person(person_2,30,country_2))
val tupleList = personList.flatMap(person => Person.unapply(person))
// tupleList: List[(String, Int, String)] = List((person_1,20,country_1), (person_2,30,country_2))
val wantedTupleList = tupleList.map({ case (name, age, country) => (age, country) })
// wantedTupleList: List[(Int, String)] = List((20,country_1), (30,country_2))
// the above is more easy to understand but will cause two parses of list
// better is to do it in one parse only, like following
val yourList = personList.flatMap(person => {
Person.unapply(person) match {
case (name, age, country) => (age, country)
}
})
// yourList: List[(Int, String)] = List((20,country_1), (30,country_2))
需要删除。
然后这也是PDO语法:
WHERE player_uuid = ":name"
但是,您在这里使用的bind_param(array('name' => $name))
^^^^^^^^^^^^^^^^^^^^^^
函数不支持命名占位符,PDO会这样做。
如果您使用MySQLi_ API进行连接,则需要使用mysqli_
占位符。
如果您要与PDO建立联系,则需要将?
更改为bind_param()
。
不同的MySQL API不会混用。
有关预准备语句的MySQLi_语法,请参阅:
基本绑定语法bindParam()
--- WHERE Name=?
有关预准备语句的PDO语法,请参阅:
基本绑定语法$stmt->bind_param("s", $city);
--- VALUES (:name, :value)
为相应的功能使用相同的连接API。
还要确保您的GET数组包含值。
通过PHP检查错误:
如果您从表单中获取这些内容,请确保它不使用POST方法。
因此,根据您用于连接的API,您可以使用以下内容来帮助您检查查询中的错误:
只有“你”知道正在使用哪一个。
但是,您在此处标记为$stmt->bindParam(':name', $name);
,因此这表明您可能正在使用MySQLi_ API进行连接。如果是,请按照上面的例子进行操作。
如果是mysqli
,那就更大了。
答案 1 :(得分:0)
您必须删除select语句中的双引号字符串
WHERE player_uuid = ":name"
Mysqli
bind_param
是否需要将数据类型传递给bind参数,以便与bind params一起执行查询
mysqli_stmt :: bind_param - mysqli_stmt_bind_param - 将变量绑定到预准备语句作为参数
面向对象的风格
bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
程序风格
bool mysqli_stmt_bind_param ( mysqli_stmt $stmt , string $types , mixed &$var1 [, mixed &$... ] )
在传递给mysqli_prepare()
的SQL语句中为参数标记绑定变量。
bind_param
参数:
这是使用$stmt->bind_param()
完成的;
此函数至少需要两个参数。
信息字符串只能包含以下字符: b,d,i和s 。这些代表blob,double,integer和string。
您需要在基于mysqli的规则中使用名为?
的占位符,而您使用的:name
完全不合适,您需要将其删除。
示例:使用Mysqli bind_param
$color = "purple";
$stmt = $mysqli->stmt_init();
if ($stmt->prepare("SELECT FirstName, LastName FROM Friends
WHERE FavoriteColor = ?")) {
$stmt->bind_param("s", $color);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_row()) {
//do stuff with the data in the $row array
}
$result->close();
}