PHP bind_param():变量数与预准备语句中的参数数量不匹配

时间:2013-04-27 07:31:20

标签: php mysql oop

我正在搜索和搜索,但我没有找到问题,希望你能帮助我:

  

“警告: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();
    }
}
?>

2 个答案:

答案 0 :(得分:4)

我担心您滥用预先准备好的陈述功能。绑定参数旨在将数据注入您的查询(数字,文字字符串......),而不是注入运算符,标识符或关键字。如果您接受来自不受信任来源的SQL命令,则无法防止SQL注入。换句话说:您不能将表或列名称作为绑定参数传递

SQL解析器不仅盲目地替换所有?符号 - 它是一个上下文敏感工具。结果,这个:

`?`

...不被视为占位符,而是文字标识符,因此错误。

,例如,在以下代码中:

SELECT *
FROM `?`
WHERE foo=? OR bar='?' OR dot='How are you doing?'

...我们最多有?个符号,但解析器只会将foo=?处理为占位符,因为当代码被解析为SQL时,?是唯一的一个位于字面值预期的位置。所以:

  1. 只有传递一个参数时,代码才会运行。
  2. 如果您没有名为?的表格,则查询填充失败。

答案 1 :(得分:0)

bind_param()

不需要table_name

更改Integer type

participant_count的{​​{1}}
bind_param()