2017-04-07 77 views
0

這是我第一次嘗試Slim 3.我試圖做一個簡單的Web應用程序,但每當我嘗試檢索NULL/Empty請求參數時,它總是一個字符串,並試圖將值保存到數字列將導致Slim 3 - getParsedBody()錯誤的整數值:'NULL'

General error: 1366 Incorrect integer value: 'NULL' for column 'last_login' at row 1

驗證每個參數似乎是一項耗盡的任務。我想知道這是我唯一的選擇,還是有一些我錯過了。

我也試圖用私有字段保存對象到數據庫中的一些問題,所以我真的很感謝我的方法的任何意見。

表設計

CREATE TABLE `users` (
    `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `last_login` datetime DEFAULT NULL, 
    PRIMARY KEY (`user_id`) 
) 

用戶模型

class User implements JsonSerializable 
{ 

    private $user_id; 
    private $name; 
    private $last_login; 

    public function __construct($user_id = null, $name = null, $last_login = null) 
    { 
     if ($user_id !== null) $this->user_id = $user_id; 
     if ($name !== null) $this->name = $name; 
     if ($last_login !== null) $this->last_login = $last_login; 
    } 

    /** 
    * Getters and setters 
    */ 

    function jsonSerialize() 
    { 

     return get_object_vars($this); 
    } 
} 

UserDAO的

class UserDAO 
{ 

    public function addUser(User $user) 
    { 

     $query = $this->connection->prepare('INSERT INTO ' . TABLE_USERS . ' VALUE (:user_id, :name, :last_login)'); 
     $result = $query->execute((array)$user->jsonSerialize()); 

     return $result; 
    } 
} 

不調用上執行jsonSerialize()將導致

'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

我假設PDO無法訪問模式的私人領域,我可能是錯的壽。


路線

$app->post('/user/add', function (Request $request, Response $response) { 

    $input = $request->getParsedBody(); 

    $userDAO = new UserDAO(); 

    $id = $input['user_id']; 
    $name = $input['name']; 
    $last = $input['last_login']; 

    // Set ID as NULL to show the difference dump between ID and Last_login 
    $user = new User(null, $name, $last); 

    var_dump($input); 
    var_dump($user); 

    $userDAO->addUser($user); 
}); 

轉儲結果

C:\wamp64\www\Rest\app\core\Routes.php:61: 
array (size=3) 
    'user_id' => string 'NULL' (length=4) 
    'name' => string 'B' (length=1) 
    'last_login' => string 'NULL' (length=4) 

C:\wamp64\www\Rest\app\core\Routes.php:62: 
object(User)[59] 
    private 'user_id' => null 
    private 'name' => string 'B' (length=1) 
    private 'last_login' => string 'NULL' (length=4) 

我想這是整個問題,如何把這字符串 'NULL'NULL以有效的方式。


插入方法在excute上添加jsonSerialize()後工作得很好。嘗試從index.php調用addUser()並將數據插入到數據庫中。

對不起,很長的文章,但我試圖刪除很多領域的簡單而不留下任何相關的代碼。

+0

顯示您正在執行的實際捲曲請求。這聽起來像你正在發送字符串值「NULL」而不是null。 –

+0

@MikaTuupola這是由PhpStorm休息工具或郵遞員(Chrome擴展)處理。基本上填補領域,正如Rob在他的回覆中提到的那樣,它總是以字符串形式出現。 – Mody

回答

0

Request對象中的所有數據都是字符串。因此,如果它是字符串"NULL",則需要手動將其轉換爲null

解決此問題的最簡單方法是停止插入user_id,因爲它是一個自動增量字段。即要準備的正確SQL語句是:

$query = $this->connection->prepare('INSERT INTO ' . TABLE_USERS 
    . ' (name, last_login) VALUE (:name, :last_login)'); 
+0

我只是認爲必須有一個更簡單的方法來處理這個問題,除了手動轉換所有字段。特別是在大量的領域,也必須單獨做。 至於'user_id'我把它保存在那裏僅僅用於測試目的。我在很多表中有太多無效的數字字段,插入'「NULL」'是很明顯的問題。 – Mody

+0

使用過濾和驗證庫,如zend-inputfilter,並創建一個「NULL」到'null'過濾器? –

+0

對不起,花了這麼長時間,但這實際上非常有用,所以我將它標記爲答案。 – Mody