cakephp-修改和保存数据

cakephp-修改和保存数据,php,mysql,cakephp,Php,Mysql,Cakephp,最近我一直在尝试学习cakephp,但我很难找到任何关于在修改后将数据存储到表中的教程。我习惯于完全控制PHP中的所有内容,因此适应MVC的自动化过程是一件很困难的事情 我认为一个好的第一个实验应该是获取一个输入并连接一个字母(让我们说“m”)。然后,将原始值和连接的值存储在一个带有字段“orignal”和“concatenated”的表中。因此,如果我键入“hello”,原始字段中的值将是“hello”,连接的字段将是“hellom” 我的问题是模型是否负责连接原始值?它是否也会起到节约的作用

最近我一直在尝试学习cakephp,但我很难找到任何关于在修改后将数据存储到表中的教程。我习惯于完全控制PHP中的所有内容,因此适应MVC的自动化过程是一件很困难的事情

我认为一个好的第一个实验应该是获取一个输入并连接一个字母(让我们说“m”)。然后,将原始值和连接的值存储在一个带有字段“orignal”和“concatenated”的表中。因此,如果我键入“hello”,原始字段中的值将是“hello”,连接的字段将是“hellom”

我的问题是模型是否负责连接原始值?它是否也会起到节约的作用,或者这是管制员的责任

class Concatenate extends AppModel {

function saveConcat($original,$concatenated) {
        $this->set(array(
        'original' => $original,
        'concatenated' => $concatenated));
        $this->save();
        }

}

?>
这是我的代码:我得到以下错误。 致命错误:对第6行的/Applications/XAMPP/xamppfiles/htdocs/cake/app/Model/Concatenate.php中的非对象调用成员函数save()

View/Concatenates/add.php
<h1>Add Something</h1>
<?php

   echo $this->Form->create('Concatenate');
   echo $this->Form->input('original');
   echo $this->Form->end('Add Numbers');

?>
现在是控制器

<?php
class ConcatenatesController extends AppController {

public  $helpers = array('Html', 'Form');
public $components = array('Session');

public function index() {
     $this ->set('concatenates', $this->Concatenate->find('all'));  
} 

 public function add() {
    if ($this->request->is('post')) {
        $original = $this->request->data['Concatenate']['original'];
        $concatenated =  $original."m" ;
        $this->Concatenate->saveConcat($original,$concatenated);
    }
}

function isempty(){ //used to check if there is data in the table. If there isn't any, "no data" will be displayed
       $mysorts = $this->Concatenate->find('all');
       $this->set('concatenates', $mysorts);
 }
}
?>

这是一场关于胖模特/瘦控制器的永无休止的争论(或偏好),反之亦然

就节约而言,模型应该明确地处理这方面的逻辑。尽管如此,您很可能会从控制器调用它,如
$myModel->save($data)

class Concatenate extends AppModel {

function saveConcat($original,$concatenated) {
        $this->set(array(
        'original' => $original,
        'concatenated' => $concatenated));
        $this->save();
        }

}

?>
在连接值时,我个人会在控制器中处理它,因为它是与模型没有直接关系的业务逻辑。例如,您可能希望连接字符串并将其发送到视图

class Concatenate extends AppModel {

function saveConcat($original,$concatenated) {
        $this->set(array(
        'original' => $original,
        'concatenated' => $concatenated));
        $this->save();
        }

}

?>
[编辑]

免责声明:我几乎没有使用CakePHP的经验,但基本原理是一样的。

您提到您无法让它工作,所以我注意到的一件事是您的模型中有一个名为
Concatenate()
的函数。这是PHP4风格的构造函数,不再是“最佳实践”(当然,除非您正在运行PHP4,但您究竟为什么要这样做)。事实上,它很可能在不久的将来被完全弃用。PHP5构造构造函数的方法是使用
\uu construct()
函数。如果您决定使用构造函数,我会确保调用
parent::\uu construct()以确保父AppController类正确加载

在查看
Concatenate()
方法的功能时,我怀疑您是否打算将其作为构造函数。将该函数重命名为类似于
saveConcat()
的清晰名称。此外,我不确定我是否会使用
$this->request->data
作为源代码,以防您希望能够重用此函数并使用任何值调用它。在这种情况下,我将向函数中添加一个参数

class Concatenate extends AppModel {

    function saveConcat($data) {

       if ($this->Concatenate->save($data)) { 

          $this->Session->setFlash('Your post has been saved.');
          $this->redirect(array('action' => 'index'));

       } else {

          $this->Session->setFlash('Unable to add your post.');

       }

    }

}
然后在控制器的某个地方,您必须实际调用此函数。将控制器中的
add()
函数修改为如下内容:

public function add() { 

   if ($this->request->is('post')) {

      // Put data into array for saving
      $data[] = array( 'original' => $this->request->data );
      $data[] = array( 'concatenated' => $original."m" );

      // Call model function to save it
      $this->Concatenate->saveConcat($data);

   }

}
[编辑2]

我就是不明白为什么会出现这样的错误:对非对象调用成员函数save()

当您从Concatenate类内部调用
$this->Concatenate->save
时,这意味着您试图访问名为Concatenate的类内部的变量并执行函数。当然,两者都不存在。原因是您需要这样调用对象本身:

$this->save("blah blah");

该方法(我假设是AppModel类的父方法)将被调用,引用
连接
对象的当前实例。

我将编写代码,并在完成后立即发布它。我想我需要一些提示。当我对PHP非常熟悉后,我决定学习cakephp。现在我觉得自己又像一个无知的新手了!我真的很感谢你的建议。StackOverflow更多的是针对能够提供明确答案的客观问题。如果你想查看你的代码,请转到我在上面添加的代码。我不一定希望我的代码像你建议的codereview.StackExtange.com那样被审查(主要是因为我无法让它正常工作),而是希望得到一些关于我做错了什么以及我需要做什么来纠正它的提示。谢谢你的帮助!我正在浏览这些官方的cakephp教程,控制器正在进行保存,而不是模型@user1104854请参见上面的编辑。希望这能澄清一些事情。
class Concatenate extends AppModel {

function saveConcat($original,$concatenated) {
        $this->set(array(
        'original' => $original,
        'concatenated' => $concatenated));
        $this->save();
        }

}

?>