【问题标题】:SQLSTATE[HY093]: number of bound variables does not match number of tokens inSQLSTATE[HY093]:绑定变量的数量与中的标记数量不匹配
【发布时间】:2018-04-03 13:27:27
【问题描述】:

我在这段代码中的目标是为用户创建稍后应用部分,我创建了一个隐藏按钮来获取确切帖子的 id,我正在获取 id,但是当我绑定并执行时,我有这个警告,我检查了其他几个与我类似的问题,但他们似乎并没有解决我的确切问题。我到底要绑定什么来获取具有该特定 ID 的帖子的信息

这是函数:

public function Index(){

    if(isset($_POST['submit'])){
        $id = $_POST['applylater_id'];// I got this from a button the user is to click
        // INSERT INTO MYSQL
        $this->query('INSERT INTO apply_later(id, title, body, link, user_id, user_name) SELECT id, title, body, link, user_id, user_name FROM shares WHERE id = :id');
        $this->bind(':title', 'title');
        $this->bind(':body', 'body');
        $this->bind(':link', 'link');
        $this->bind(':user_id', 1);
        $this->bind(':user_name', 'user_name');         
        $this->bind(':id', $id);
        $this->execute();

        //Verify
        if($this->lastInsertId()){
            //Redireect
            Messages::setMsg('Successfully Added to your apply Later section', 'successMsg'); 
            header( "refresh:2; url=http://localhost/phpsandbox/phptutorials/website2/shares/applylater" );

        }
    }
    //
    $this->query('SELECT * FROM shares ORDER by id desc ');
    $rows = $this->resultSet();
    return $rows;
}

//这是我上面调用的绑定和执行函数

public function query($query){
    $this->stmt = $this->dbh->prepare($query);
}


public function bind ($param, $value, $type =null) {
if(is_null($type)){
    switch(true) {
        case is_int($value):
            $type = PDO::PARAM_INT;
            break;
        case is_bool($value):
            $type = PDO::PARAM_BOOL;
            break;
        case is_null($value):
            $type = PDO::PARAM_NULL;
            break;
            default:
            $type = PDO::PARAM_STR;
    }

        }
    $this->stmt->bindValue($param, $value, $type);
}

public function execute(){
    return $this->stmt->execute();
}

现在这是我使用的主要形式,但它可以获取 id 但不显示在屏幕上

<?php foreach ($viewmodel as $item) : ?>
    <div class="well">
        <div class="text-center">
            <img src="http://localhost/phpsandbox/phptutorials/website2/assets/image/job.png" class="img-circle" alt="Cinque Terre" width="50" height="50">

        <h3> <?php echo $item['title']; ?></h3>
        <small> Username: <?php echo $item['user_name']; ?></small>
        <br />
        <small><?php echo $item['create_date']; ?></small>
        </div>
        <hr />
        <p><?php echo $item['body']; ?></p>
        <br />
        <div class="text-center">
            <a href="<?php echo $item['link']; ?>" target="_blank"  class="btn btn-info">Apply Now</a>
            <br />

        </div>
        <hr />
        <form method="post" action="<?php $_SERVER['PHP_SELF']; ?>" >

// 当你点击提交时,我想获取这个确切帖子的 id 并将数据发送到不同的表中,这样我就可以在不同的页面中显示这个确切的帖子。

                <input type="hidden" name="applylater_id" value="<?php echo $item['id']; ?>">
                <input class="btn btn-primary" type="submit" name="submit" value="Apply Later">
        </form>

这是我的桌子

    </div>[enter image description here][1]

【问题讨论】:

  • 你明白这段代码在做什么吗?错误信息很清楚...您正在尝试绑定 6 个参数,但您只有 1 个位置。
  • 那我该怎么办,对不起,我只是在学习 php,我可能不清楚。谢谢@Devon
  • 好吧,你为什么要绑定所有这些参数?不要只是复制和粘贴代码,要知道你在写什么,这样你才能真正从中学习......
  • 我正在尝试将确切的帖子与确切的 id 绑定,然后将其发送到不同的表中。如果有更好的方法,我很想知道这就是我问这个问题的原因

标签: php pdostatement


【解决方案1】:

仅将值绑定到有占位符的准备好的语句。

$this->query('INSERT INTO apply_later(id, title, body, link, user_id, user_name)
              SELECT id, title, body, link, user_id, user_name FROM shares WHERE id = :id');
//                       only 1 placeholder-------------------------------------------^^^

删除这些行,因为它们没有在准备好的语句中表示:
$this-&gt;bind(':title', 'title');
$this-&gt;bind(':body', 'body');
$this-&gt;bind(':link', 'link');
$this-&gt;bind(':user_id', 1);
$this-&gt;bind(':user_name', 'user_name');

只需绑定:id:

$this->bind(':id', $_POST['applylater_id']);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多