簡體   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