【问题标题】:sql error :SQLSTATE[HY093] while binding params绑定参数时出现 sql 错误:SQLSTATE[HY093]
【发布时间】:2016-04-08 23:06:02
【问题描述】:

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

我用它来连接 db 和 crud,直到现在所有工作都正常工作

但是当我运行此代码时,不断收到此错误:SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

除此之外,所有绑定都可以正常工作:

    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;
}

我尝试随机搅拌并在数据库中检查它,然后再使用该代码。

这是我的完整代码` 函数 __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 或.. 并回显所有变量 谢谢

【问题讨论】:

  • 你确定是这个查询导致了这个错误吗?错误含义是参数的数量不等于占位符的数量。顺便说一句,我希望echo $key 仅用于调试目的。
  • 是的,我确定。我回显所有变量一切正常

标签: php mysql pdo


【解决方案1】:

好的,我发现了问题 如果您使用此类,则问题出在绑定中,在执行之前不要尝试绑定变量,只需将它们存储在数组中并使用执行吃完最后的绑定,我会更改代码并且工作良好;)

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-04
    • 2021-06-18
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    相关资源
    最近更新 更多