sql错误:绑定参数时出现SQLSTATE[HY093]


sql error :SQLSTATE[HY093] while binding params

hi使用这个pdo-php类https://github.com/indieteq/PHP-MySQL-PDO-Database-Class

我用它来连接数据库和crud,直到现在所有的工作都很好

但当我运行此代码时,不断收到以下错误:SQLSTATE[HY093]:无效的参数编号:参数未定义

所有的绑定都很好,除了这个:

    function generateRandomString()
{
    $length = 5;
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i ++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    $key = $randomString;
    $setto = false;
    while ($setto == false) {
                $result = $this->db->query('SELECT `vkey` FROM `polls` WHERE `vkey`=:vkey', array(
                    'vkey' => $key
                ));
        if (count($result) > 0) {
            $randomString = '';
            for ($i = 0; $i < $length; $i ++) {
                $randomString .= $characters[rand(0, $charactersLength - 1)];
            }
            $key = $randomString;
        } else {
            $setto = true;
        }
    }
    echo $key;
    return $key;
}

我试着得到一个随机的stiring,并在它使用或不使用该代码之前在db中检查它。

这是我的完整代码`函数__construct(){父级::__construct();}

function addpoll($args, $questions)
{
    for ($i = 0; $i < 2 + $questions; $i ++) {
        $args[$i] = parent::escape($args[$i]);
    }
    $args[1] = parent::convertHashtags($args[1]);
    $this->db->bind('title', $args[0]);
    $this->db->bind('description', $args[1]);
    $this->db->bind('answer1', $args[2]);
    $this->db->bind('answer2', $args[2]);
    $param = '';
    if ($questions > 2) {
        for ($i = 3; $i < $questions + 1; $i ++) {
            $param = $param . ':answer' . $i . ',';
            $this->db->bind('answer' . $i, $args[$i]);
        }
        if (10 - $questions > 0) {
            $count = 0;
            while (10 - $questions > $count) {
                $param = $param . ' '''' ,';
                $count ++;
            }
        }
    } else {
        $count = 0;
        while (10 - $questions > $count) {
            $param = $param . ' '''' ,';
            $count ++;
        }
    }
    $this->db->bind('subject', $args[$questions + 1]);
    $sql = 'INSERT INTO `polls` (`id`, `title`, `about`, `answer1`, `answer2`, `answer3`, `answer4`, `answer5`, `answer6`, `answer7`, `answer8`, `answer9`, `answer10`, `mode`, `confirmation`, `who`, `password`, `confirmed`, `createdate`, `expiredate`,`subject`,`pkey`) VALUES (NULL,:title, :description ,:answer1 ,:answer2,';
    $param = $param . ' 0 , 0 , 0 , '''' , 0 ,' . time() . ' ,';
    $settings = time() + ($args[$questions + 3] * 86400) . ',:subject , ';
    $sql = $sql . $param . $settings . '''' . $this->generateRandomString() . '''' . ')';
    echo $sql;
    $this->db->query($sql);
}
private function getsub($id)
{
    $result = $this->db->query('SELECT * FROM `subject` WHERE id=:sid ', array(
        'sid' => $id
    ));
    if (count($result) == 1) {
        return $id;
    }
    return 1;
}
function generateRandomString()
{
    $length = 5;
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i ++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    $key = $randomString;
    $setto = false;
    while ($setto == false) {
                $result = $this->db->query('SELECT `vkey` FROM `polls` WHERE `id`=:id', array(
                    'id' => $key
                ));
        if (count($result) > 0) {
            $randomString = '';
            for ($i = 0; $i < $length; $i ++) {
                $randomString .= $characters[rand(0, $charactersLength - 1)];
            }
            $key = $randomString;
        } else {
            $setto = true;
        }
    }
    echo $key;
    return $key;
}

`我尝试了不同的关键字,如:vkey2或。。并回显所有变量感谢

好的,我发现了问题绑定中的问题是,如果你使用这个类,在执行之前永远不要尝试绑定变量,只需将它们存储在数组中,并使用execute执行结束绑定。我更改了代码,效果很好;)

private $binds=array();
function __construct()
{
    parent::__construct();
}
function addpoll($args, $questions)
{
    for ($i = 0; $i < 2 + $questions; $i ++) {
        $args[$i] = parent::escape($args[$i]);
    }
    $args[1] = parent::convertHashtags($args[1]);
    $this->binds['title']=$args[0];
    $this->binds['description']=$args[1];
    $this->binds['answer1']=$args[2];
    $this->binds['answer2']=$args[3];
    $param = '';
    if ($questions > 2) {
        for ($i = 3; $i < $questions + 1; $i ++) {
            $param = $param . ':answer' . $i . ',';
            $this->binds['answer' . $i]= $args[$i];
        }
        if (10 - $questions > 0) {
            $count = 0;
            while (10 - $questions > $count) {
                $param = $param . ' '''' ,';
                $count ++;
            }
        }
    } else {
        $count = 0;
        while (10 - $questions > $count) {
            $param = $param . ' '''' ,';
            $count ++;
        }
    }
    $this->binds['subject']=$args[$questions + 1];
    $this->binds['date']=time();
    $this->binds['todate']=time() + ($args[$questions + 3] * 86400);
    $this->binds['pkey']=$this->generateRandomString();

    $sql = 'INSERT INTO `polls` (`id`, `title`, `about`, `answer1`, `answer2`, `answer3`, `answer4`, `answer5`, `answer6`, `answer7`, `answer8`, `answer9`, `answer10`, `mode`, `confirmation`, `who`, `password`, `confirmed`, `createdate`, `expiredate`,`subject`,`pkey`) VALUES (NULL,:title, :description ,:answer1 ,:answer2,';
    $param = $param . ' 0 , 0 , 0 , '''' , 0 ,:date ,';
    echo 'test';
    $settings = ':todate ,:subject , ';
    $sql = $sql . $param . $settings . ':pkey)';
    $this->db->query($sql,$this->binds);
}
private function getsub($id)
{
    $result = $this->db->query('SELECT * FROM `subject` WHERE id=:sid ', array(
        'sid' => $id
    ));
    if (count($result) == 1) {
        return $id;
    }
    return 1;
}
function generateRandomString()
{
    $length = 5;
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i ++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    $key = $randomString;
    $setto = false;
    while ($setto == false) {
                $result =  $this->db->query('SELECT * FROM `polls` WHERE pkey=:pkey ', array(
        'pkey' => $key
    ));
        if (count($result) > 0) {
            $randomString = '';
            for ($i = 0; $i < $length; $i ++) {
                $randomString .= $characters[rand(0, $charactersLength - 1)];
            }
            $key = $randomString;
        } else {
            $setto = true;
        }
    }
    return $key;
}