2017-04-07 7 views
0

これはSlim 3の最初の試みです。単純なWebアプリケーションを作成しようとしていますが、NULL /空のリクエストパラメータを取得しようとしているときは、文字列、および数値列に値を保存しようとすると、各パラメータの検証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; 
    } 
} 

私はPDOがモデルのプライベートフィールドにアクセスすることはできません、私は間違っているカントー可能性を前提と

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

になります実行にjsonSerialize()を呼び出していません。


ルート

$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()を追加しても、insertメソッドはうまく動作します。 index.phpからaddUser()を呼び出して、データをデータベースに挿入しようとしました。

申し訳ありませんが、長いコードは残していませんが、コードを残すことなく簡単に多くのフィールドを削除しようとしました。

+0

実際のカール要求を表示します。nullの代わりに "NULL"の文字列値を送信しているようです。 –

+0

@MikaTuupolaこれは、PhpStormの休止ツールまたはPostman(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

関連する問題