繁体   English   中英

PHP PDO-使用bindParam插入INTO不起作用

[英]PHP PDO - INSERT INTO with bindParam does not work

我停留在这小段代码:

$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从数据库中选择内容,但是通过插入某些内容,它不起作用。 用户只能访问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服务器上运行-这是原因吗? 我必须使用问号(?)吗?

谢谢路易斯

您缺少准备和半冒号的右括号

$exc = $dbh->prepare("INSERT INTO fruit(id, type, name) VALUES (:id, :type, :name)");

如果不起作用,则添加此行以检查错误

print_r($exc->errorInfo());

回答问题1:

PHP PDO-使用bindParam插入INTO不起作用

如果您要在自动递增字段中插入ID并且已经插入,则将导致MySQL错误(A_I字段值重复)– Martin


是的,我知道,我在实际陈述中使用了DEFAULT关键字。 – louis12356


说明; 默认关键字是什么? –马丁


有一个SQL关键字“ DEFAULT”可以自动递增ID。 – louis12356


应该提供您自动递增(值id )列。 看起来是通过PDO变量给出了MySQL指令 ,该指令 永远不会起作用 这是因为PDO使用预处理语句 ,因此变量只会成为变量,而永远不会成为指令

MySQL中的Default关键字是对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 

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

您需要做的是:

  • 将您的价值观设置为public
  • 或者 ,在您的类中构建settergetter方法,以便您可以根据需要频繁地提取这些私有值( 哦,马特龙! )。

所以:

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

如果您使用(?)将是下一个代码

$exc = $dbh->prepare("INSERT INTO fruit(id, type, name) VALUES (?, ?, ?)");                               
$exc->bindParam(1,   $fruit_object->id,   PDO::PARAM_INT);
$exc->bindParam(2, $fruit_object->type, PDO::PARAM_STR);
$exc->bindParam(3, $fruit_object->name, PDO::PARAM_STR);
$exc->execute();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM