我正在搜索和搜索,但我没有找到问题,希望你能帮助我:
“警告:mysqli_stmt :: bind_param():变量数不匹配 第24行“mydir”中预准备陈述中的参数数量“
<?php
class Tunier {
// name of Tunier
protected $tunier_name;
// count of participants
protected $participant_count;
function __construct($name, $participant) {
// mysqli connection
$db = new mysqli('localhost','root','','tuniere') or die ('Cant connect to MySql Please try later again');
$this->tunier_name = $name or die('---');
$this->participant = $participant or die('---');
// einrichtung der Tabelle
$query = 'CREATE TABLE `?`(
`?` VARCHAR(32) PRIMARY KEY NOT NULL,
`?` INT(2) NOT NULL,
`id_spieler` INT(10) NULL
);';
$stmt = $db->prepare($query);
$stmt->bind_param('sss', $this->tunier_name, $this->tunier_name, $this->participant_count);
$stmt->execute();
}
}
?>
答案 0 :(得分:4)
我担心您滥用预先准备好的陈述功能。绑定参数旨在将数据注入您的查询(数字,文字字符串......),而不是注入运算符,标识符或关键字。如果您接受来自不受信任来源的SQL命令,则无法防止SQL注入。换句话说:您不能将表或列名称作为绑定参数传递。
SQL解析器不仅盲目地替换所有?
符号 - 它是一个上下文敏感工具。结果,这个:
`?`
...不被视为占位符,而是文字标识符,因此错误。
,例如,在以下代码中:
SELECT *
FROM `?`
WHERE foo=? OR bar='?' OR dot='How are you doing?'
...我们最多有?
个符号,但解析器只会将foo=?
处理为占位符,因为当代码被解析为SQL时,?
是唯一的一个位于字面值预期的位置。所以:
?
的表格,则查询填充失败。答案 1 :(得分:0)
bind_param()
table_name
更改Integer type
participant_count
的{{1}}
bind_param()