0

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

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

2 回答 2

3

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

SQL 解析器不只是?盲目地替换所有符号——它是一个上下文敏感的工具。因此,这:

`?`

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

例如,在以下代码中:

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

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

  1. 只有传递一个参数,代码才会运行。
  2. 如果您没有名为 的表,则查询填充将失败?
于 2013-04-27T07:34:38.977 回答
0

不需要bind_param()你的table_name

更改Integer typeparticipant_count_bind_param()

$stmt->bind_param('ssi', $this->tunier_name, $this->tunier_name, $this->participant_count);
于 2013-04-27T07:35:21.357 回答