php - fatal error : Uncaught exception 'PDOException' : Invalid parameter number: parameter was not defined' on the execution of my $params array

标签 php mysql arrays api error-handling

我在连接文件中的这一行收到此错误:

$语句->执行($params);

这是我的连接文件(顺便说一句,我知道我的凭据是什么,我只是不想显示它),

<?php
class connect
{

    private static function db()
    {
        $pdo = new PDO('mysql:host=127.0.0.1;dbname=mysql;charset = utf8', 'username','password');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    }
    public static function query($query,$params = array())
    {

        $statement = self :: db()->prepare($query);
        $statement->execute($params);
        if(explode(' ',$query)[0] == 'SELECT')
        {
            $data = $statement->fetchAll();
            return $data;
        }
    }
}

?>

但是问题源于此调用,

connect::query('INSERT INTO dry_posts VALUES (null, :postbody, NOW(), 0, \'\')', array(':postimg'=>$postimg));

这是我通过 imgur api 上传和显示图像的文件(这不是完整的文件)。

<?php 
include("connect.php"); 
include("check.php");
//include("image.php");

$postbody = "";
$posts = "";
$postimg = "";


                if (isset($_POST['post'])) {

                        if ($_FILES['postimg']['size'] == 0) 
                        {
                                $postbody = $_POST['postbody'];
                                $loggedInUserId = check::isLoggedIn();
                                if (strlen($postbody) > 160 || strlen($postbody) < 1) 
                                {
                                    die('Incorrect length!');
                                }

                                connect::query('INSERT INTO dry_posts VALUES (null, :postbody, NOW(), 0,:postimg)', array(':postbody'=>$postbody));

                                // Post::createPost($_POST['postbody']);

                        } 
                        else {

                            $url       = 'https://api.imgur.com/3/image'; // API endpoints, info: https://api.imgur.com/endpoints/image#image-upload
                    $client_id = '72316d91aac85c7'; // Get client_id here: https://api.imgur.com/#registerapp

                    $fh   = fopen($_FILES['postimg']['tmp_name'], 'r');
                    $read = fread($fh, $_FILES['postimg']['size']);
                    fclose($fh);
                    $post = array(
                                'image' => base64_encode($read)
                            );
                    $ch   = curl_init();
                    curl_setopt($ch, CURLOPT_URL, $url);
                    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                                                             'Authorization: Client-ID '.$client_id
                                                         ));
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    $json = curl_exec($ch); // Response, info: https://api.imgur.com/#responses
                    curl_close($ch);
                    // $image = json_decode($json, true); // Array
                    $image = json_decode($json); // Object
                    // var_dump($image);
                    //$postimg = $image['data']['link']; // Array-style
                    $postimg = $image->data->link; // Object-style


                                    // Insert $postimg to database?
                                    //connect::query('INSERT INTO dry_posts VALUES (null, :postbody, NOW(), 0, \'\')', array(':postimg'=>$postimg));
                    connect::query('INSERT INTO dry_posts VALUES (null, :postbody, NOW(), 0, :postimg)', array(':postimg'=>$postimg));
                                    //connect::query("UPDATE posts SET postimg=:postimg WHERE id=:postid", array(':postid' => $postid, ':postimg' => $postimg));
                            }


                        }

                if (isset($_GET['postid'])) 
                {
                        //Post::likePost($_GET['postid']);

                    if (!connect::query('SELECT post_id FROM post_likes WHERE post_id=:postid', array(':postid'=>$_GET['postid']))) 
                    {
                           connect::query('UPDATE dry_posts SET likes=likes+1 WHERE id=:postid', array(':postid'=>$_GET['postid']));
                           connect::query('INSERT INTO post_likes VALUES (null, :postid)', array(':postid'=>$_GET['postid']));
                    } 
                    else 
                    {
                          connect::query('UPDATE dry_posts SET likes=likes-1 WHERE id=:postid', array(':postid'=>$_GET['postid']));
                          connect::query('DELETE FROM post_likes WHERE post_id=:postid', array(':postid'=>$_GET['postid']));
                    }

                    //Post::likePost($_GET['postid']);
                }

                // $posts = Post::displayPosts();

        //title is body or whereclause, search_results is posts or $paramsarray, results is paramsarray


                $dbposts = connect::query('SELECT * FROM dry_posts ORDER BY id DESC');
                $posts = "";
             //if(isset($_POST['postimg'])){ 
                foreach($dbposts as $p){
                        if (!connect::query('SELECT post_id FROM post_likes WHERE post_id=:postid', array(':postid'=>$p['id']))) {
                                $posts .="<img src='".$p['postimg']."'>".htmlspecialchars($p['body'])."
                                <form action='try.php?postid=".$p['id']."' method='post'>
                                        <input type='submit' name='like' value='Like'>
                                        <span>".$p['likes']." likes</span>
                                </form>
                                <hr /></br />
                                ";

                        } else {
                                $posts .="<img src='".$p['postimg']."'>".htmlspecialchars($p['body'])."
                                <form action='try.php?postid=".$p['id']."' method='post'>
                                        <input type='submit' name='unlike' value='Unlike'>
                                        <span>".$p['likes']." likes</span>
                                </form>
                                <hr /></br />
                                ";
                        }
                }


?>

connect::query('SELECT body FROM dry_posts WHERE body LIKE :body '.$whereclause.'', $paramsarray);

我确信我在连接文件中接受参数的方式没有任何问题,因为它在我传递 $postbody 数组时起作用,所以 postimg 的定义方式有问题吗?我错过了什么? postimg 是此表单的输入变量

<form action="try.php" class = "forum" method="post" enctype="multipart/form-data">
<textarea name="postbody" rows="4" cols="60" class = "text"></textarea>
         <br />Upload an image:
        <input type="file" name="postimg">
        <input type="submit" name="post" value="Post">
        <input type="submit" value="Upload">
</form>

最佳答案

connect::query('
    INSERT
    INTO   dry_posts
    VALUES (
        null,
        :postbody,  <-- you name your placeholder :postbody
        NOW(),
        0,
        \'\'
    )
', array(
    ':postimg' => $postimg  <-- you're trying to fill a placeholder named :postimg
));

更改您的查询以使用 :postimg 作为占位符,或更改您的数组以尝试填充 :postbody 占位符。

关于php - fatal error : Uncaught exception 'PDOException' : Invalid parameter number: parameter was not defined' on the execution of my $params array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43902527/

相关文章:

javascript - WordPress wp_enque_scripts 似乎不起作用

php - 使用 PHP 代码将 mysql 表导出为 CSV

javascript - 如何链接外部Js文件中的公共(public)目录

php - 无法提交到数据库

c - 将整数文本文件解析为数组

php - 为什么 PHP 的 "password_hash"不返回字符串?

mysql查询获取最后一个id并插入值(如果不存在)

c - 如何将实际字符存储到数组中?

大多数语言的行和列索引约定

java - Linux环境下Mule应用与mysql数据库的数据库连接问题