PHP PDO - 带有 bindParam 的 INSERT INTO 不起作用

用户7752322

我坚持在这段代码中:

$fruit_object = new fruit(1234, 'apple', 'red apple');    

try {
    $dbh = new PDO('mysql:host=localhost;charset=utf8;dbname=database', 'user', 'password');
    $exc = $dbh->prepare("INSERT INTO fruit( type, name) VALUES (:type, :name);");                               
    //$exc->bindParam(':id',   $fruit_object->id,   PDO::PARAM_INT);
    $exc->bindParam(':type', $fruit_object->type, PDO::PARAM_STR);
    $exc->bindParam(':name', $fruit_object->name, PDO::PARAM_STR);
    $exc->execute();
    $dbh = null;
    $exc = null;
} catch (PDOException $e) {
    //this function just do an echo with static content
    $this->error_database($e);
    $dbh = null;
    $exc = null;
    die();
}

我已经使用 PDO 从我的数据库中选择内容,但是使用 INSERTING 内容,它不起作用。用户只能访问 INSERT 内容 - 我已经在我的后端成功尝试过。

所以这里是错误:

Fatal error: Uncaught Error: Cannot access private property fruit_object::$type

这是我的fruit_object类:

<?php


class fruit
{
private $id;
private $type;
private $name;

function __construct($id, $type, $name)
{
    $this->id = $id;
    $this->type = $type;
    $this->name = $name;

}

function __toString()
{
    return $this->name;
}
}

对于马丁:

INSERT INTO fruit (id, type, name) VALUES (DEFAULT, 'apple', 'red apple');

我的数据库在 MySQL 服务器上运行 - 这是原因吗?我必须使用问号 (?) 吗?

谢谢你,路易斯

马丁

回答问题 1:

PHP PDO - 带有 bindParam 的 INSERT INTO 不起作用

如果你在一个自增字段中插入一个 ID 并且你已经插入了,那么它会导致一个 MySQL 错误(重复的 A_I 字段值) – Martin


是的,我知道,我在真实语句中使用了 DEFAULT 关键字。– 路易斯12356


解释; 默认关键字是什么?– 马丁


有一个 SQL 关键字“DEFAULT”,它会自动计算 ID。– 路易斯12356


你应该被提供为您自动递增(值id)列。看起来您正在通过PDO 变量给出一条MySQL 指令指令永远无法工作这是因为 PDO 使用Prepared Statements,因此变量永远只会是变量,永远不会是指令

DefaultMySQL 中关键字是对 MySQL 程序的指令。这条指令将被忽略,不仅因为它被禁止,而且因为你将一个STRING传递给 PDO INSERT,它声称它应该是一个INT

 $exc->bindParam(':id',   $fruit_object->id,   PDO::PARAM_INT);

如果$fruit_object->id == "DEFAULT"这不是整数;所以因此 PDO 不会运行查询。

解决方案

自动增量值根本不需要插入,忽略它们:

try {
    $dbh = new PDO('mysql:host=localhost;charset=utf8;dbname=database', 'user', 'password');
    $exc = $dbh->prepare("INSERT INTO fruit( type, name) VALUES ( :type, :name);");                               
    // $exc->bindParam(':id',   $fruit_object->id,   PDO::PARAM_INT);
    $exc->bindParam(':type', $fruit_object->type, PDO::PARAM_STR);
    $exc->bindParam(':name', $fruit_object->name, PDO::PARAM_STR);
    $exc->execute();
    $dbh = null;
    $exc = null;
}

您尝试运行的示例:

 INSERT INTO fruit (id, type, name) VALUES (DEFAULT, 'apple', 'red apple');

但是由于 PDO 的安全限制(忽略String/Int数据类型问题),实际运行的是:

INSERT INTO fruit (id, type, name) 
     VALUES ( <int var> "DEFAULT", <str var> "apple", <str var> "red apple"); 

所以你试图将字符串变量“Default”插入到 MySQL 的整数列中


回答问题 2:

 Fatal error: Uncaught Error: Cannot access private property fruit_object::$type

这是因为您的班级将此类型的值设置为 isPrivate而不是Public,这意味着该值不能显示在班级之外(这有点过于简化,但时间紧迫!)

您需要做的是:

  • 将您的价值观设置为可访问性 public
  • 或者,将 buildsettergetter方法添加到您的类中,这样您就可以根据需要随时提取这些私有值(哦,主妇!!)。

所以:

class fruit
{
    private $id;
    private $type;
    private $name;

    /***
     * Getter
     ***/ 
    function getType()
    {
        return $this->type;
    }

    /***
     * Setter
     ***/
    function setType($value){
         $this->type = $value;
    }
}

然后在您的 PDO 中:

$exc->bindParam(':type', $fruit_object->getType(), PDO::PARAM_STR);

这会将您的值输出到脚本。

如果你想要一个更简单的方法,你可以简单地替换private $name;public $name;,然后可以从类外部访问命名变量值:

 $exc->bindParam(':name', $fruit_object->name, PDO::PARAM_STR);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章