$this->Model->save() :这段代码有啥问题?

Posted

技术标签:

【中文标题】$this->Model->save() :这段代码有啥问题?【英文标题】:$this->Model->save() : what's is wrong with this code?$this->Model->save() :这段代码有什么问题? 【发布时间】:2011-11-17 15:08:07 【问题描述】:

我是 cakephp 的初学者,我想将一些数据保存到我的数据库中,但我总是收到:消息:抱歉,保存数据时出错。

这是我的代码:(控制器:UsersController.php:(并且我已将 Model 'UserState 添加到数组 $uses

if($onbreak == 'true')
    $userStatus = 1;
   //$response['userStatus'] = 1;
 else 
    $userStatus = 0;
    //$response['userStatus'] = 0;


//add the new user_status to the $newUserState
$newUserState['UserState']['user_id'] = $userID;// $userID = 1
$newUserState['UserState']['user_status'] = $userStatus;
//adding values for fields which should not be NULL
$newUserState['UserState']['user_phone_nb'] = '4343';

//

saving data
if($this->UserState->save($newUserState))
    $response['success'] = 'true';
    $response['message'] = '';
else
    $response['success'] = 'false';
    $response['message'] = 'Sorry, Error while saving data.';
      

提前致谢

编辑: 表用户状态的结构:

id : BIGINT 主键 AUTO INCREMENT, user_id:INT NOT NULL, user_status : SMALLINT NOT NULL, user_phone_nb = VARCHAR(15) NULL

模型用户状态:

class Userstate extends AppModel 

    var $useTable = 'userstates';
    public $name = 'UserState';

编辑 2:

当我调试变量 $newUserState 时,我得到了这个(看起来没问题):

Array
(
    [UserState] => Array
        (
            [user_id] => 18
            [user_status] => 0
            [user_phone_nb] => 4343
        )

)

【问题讨论】:

你在 core.php 中是否将 DEBUG 设置为 2? 查看我的编辑,我添加了数组 $newUserState 的调试结果 【参考方案1】:

我不确定你在这里做什么, 你能发布你的表结构并生成插入查询蛋糕吗?如果您使用标准 cake-layout 并打开调试模式,您会在底部找到它。

我怀疑(但如果没有更多数据我不确定)表中有另一个字段需要一个值(不能为空)。

【讨论】:

感谢您的回答,我没有使用标准的蛋糕布局,并且我的表格包含我想让它们空白的其他字段,我只想插入 user_status。如果某些字段不应该为空,我将验证数据库(这个字段+1 ;)) 没问题 =) 其他一些建议: - 您可以将此命令插入到您的布局中,这样您就可以看到您的蛋糕查询发生了什么: element('sql_dump '); ?> - 还要检查是否有一个字段设置为唯一 - 检查是否有一个主键自动递增的字段希望我能帮助你.. ;-) id : BIGINT 主键 user_id : INT NOT NULL user_status : SMALLINT NOT NULL user_phone-nb = VARCHAR(15) NULL 马上:如果你只保存 user_status 作为新记录,它肯定会抛出一个错误,因为 user_id 不能为空,另外:id(主键)应该设置为 autoincrement 并且 int(20) 应该足够了。 感谢您的回复,我已经添加了表格的结构(请参阅我的编辑),并且我尝试了其他朋友建议的不同方法,仍然得到相同的消息,请参阅我的最后我试过的代码。 是否有任何将字符串转换为 INT 等的东西???我尝试插入的变量类型可能有问题??【参考方案2】:

我假设数据库中的字段是“userStatus”并且只有一个值可以保存。但这应该可以工作,您应该能够对其进行扩展以保存其他值。

希望这会有所帮助。

保存新记录

if($onbreak == 'true')
    $userStatus = 1;
 else 
    $userStatus = 0;


//add the new user_status to the $newUserState
$newUserState['UserState']['user_id'] = $userID;// $userID = 1
$newUserState['UserState']['user_status'] = $userStatus;
//adding values for fields which should not be NULL
$newUserState['UserState']['user_phone_nb'] = ' ';

// Must include id as it is a primary Key and thus required for saving.
$newUserState['UserState']['id'] = $userstate_id;


//saving data
if($this->UserState->save($newUserState))
    $response['success'] = 'true';
    $response['message'] = '';
else
    $response['success'] = 'false';
    $response['message'] = 'Sorry, Error while saving data.';

好的,试试这个。

将模型重命名为 user_state.php

然后添加以下内容,基于 Cake 1.2 食谱 http://book.cakephp.org/view/436/useTable

<?php 
class Userstate extends AppModel 

    var $useTable = 'userstates';
    public $name = 'UserState';

同样在 config/core.php 中确保带有调试的行如下所示。

Configure::write('debug', 2);

试试这个,让我知道你的结果。

【讨论】:

我已经尝试过了,使用与模型结构相同的数组,但 id 不起作用,在保存数据时仍然出现错误:s:s 能否请您发布您的 UserState 模型内容...保存数组中缺少一些必需的内容。 您是否也可以在数据库表上做一个 desc 并发布它.. 保存时可能需要一些东西... 可能是模型中没有的 PK PK在模型里,我会加到我的帖子里 试试我添加的修改 $this->UserState->create()... 当然这应该只在这是一个新条目时使用。如果没有,您将需要PK...最喜欢'id'【参考方案3】:

这对你有用吗:

$this->UserState->set('UserStatus', '文章的新标题'); $this->UserState->save();

希望对你有帮助

【讨论】:

我认为这仅适用于 ActivRecord ( $this->UserState->read();【参考方案4】:

我找到了解决办法,

在我的模型中,我有变量 $validate,其中一些参数将 required 变量设置为 true。所以我有三个解决方案:

第一:

只是注释变量而不使用它^^

第二:

只需使用默认值初始化所需的变量。

第三:

我发现在文档中,我们可以告诉 cakePHP 在不执行验证的情况下保存我们的数据:

save(array
$donnees = null, boolean $valider = true, array $listeDesChamps = array())

所以我所做的只是保存数据并使用这样的错误值传递第二个参数:$this-&gt;UserState-&gt;save($newUserState, false);,(我个人使用了第三个解决方案^^)

谢谢大家的帮助:)

问候,

【讨论】:

【参考方案5】:

最后的一些提示:

    对于这样的情况,很高兴有多个验证集可以通过以下方式实现:http://bakery.cakephp.org/articles/dardosordi/2008/07/29/multivalidatablebehavior-using-many-validation-rulesets-per-model

    下次发布完整代码。如果您没有发布每个人都认为是最终的模型的 4 行表示,那么首先会猜到验证的事情。

    您应该在布局中重新包含 sql 转储。由于 DEBUG => 0,它不会在实时模式下显示,并且会在此类情况下为您提供极大的帮助。

    我认为 UserState 模型的类名应该是“UserState”,就像已经提到的文件名“user_state.php”一样。这将节省一行代码:P

问候 func0der

【讨论】:

以上是关于$this->Model->save() :这段代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

cakephp getLastInsertID()

Laravel 无法使用 Model::create() 和 $model->save() 创建模型

Laravel Eloquent $model->save() 不保存但没有错误

Yii2 - 没有通过 $model->save() 更新值

Laravel 5.3 $model->save() 值始终为空,但是批量分配有效

Backbone model.save()正在发送PUT而不是POST