【问题标题】:codeigniter restful api illegal string offset in several fields几个字段中的codeigniter restful api非法字符串偏移
【发布时间】:2017-08-11 00:12:51
【问题描述】:

我在我的 codeigniter 微应用 restful api 中不断收到此错误。当我发布一个项目时,只有第一个字母被保存并显示状态代码 400。

这是我的模型文件:

class Cities_model extends CI_Model {

    public function __construct() 
    {
        parent::__construct();
    }

    public function save($city)
    {
        $this->db->set($this->setCity($city, null))->insert('cities');

        if ($this->db->affected_rows() > 0) {
            return $this->db->insert_id;
        }
      return null;
    }

    public function update($id, $city)
    {
        $this->db->set($this->setCity($city))->where('id')->update('cities');
        if ($this->db->affected_rows() === 1) {
            return true;
        }
        return false;
    }

    private function setCity($city)
    {
        return array(
            'id' => $city['id'],
            'name' => $city['name']
        );
    }
}

【问题讨论】:

  • $this->db->set($this->setCity($city,null))->insert('cities'); 将此更改为 $this->db->insert('cities', array('city'=>$city));
  • 谢谢,但您没有包含函数 setCity,它是包含要插入的数据的函数。
  • 你扩展了CI_Model,所以它没有任何setter-getter方法,你实际上将城市值传递给函数。
  • HTTP 400 Bad Request 响应状态码表示由于语法无效,服务器无法理解请求。客户端不应未经修改就重复此请求。
  • 我在下面看到你的setCity 函数。 $this->db->insert('cities',$this->setCity(array('city'=>$city,'id'=> null)));

标签: php rest codeigniter postman


【解决方案1】:

如您所见,setCity 函数将$city 变量视为数组。所以你需要将数组传递给setCity 函数。

class Cities_model extends CI_Model {

    public function __construct() 
    {
        parent::__construct();
    }

    public function save($city)
    {
        $this->db->insert('cities',$this->setCity(array('name'=>$cit‌​y,'id'=> null)));

        if ($this->db->affected_rows() > 0) {
            return $this->db->insert_id();
        }
      return null;
    }

    public function update($id, $city)
    {
        $this->db->where('id',$id)->update('cities',$this->setCity(array('name'=>$cit‌​y,'id'=> $id)));

        if ($this->db->affected_rows() === 1) {
            return true;
        }
        return false;
    }

    private function setCity($city)
    {
        return array(
            'id' => $city['id'],
            'name' => $city['name']
        );
    }
}

另一件事是,Codeignitor 有方法 insert_id() 知道最后插入 id。

【讨论】:

  • 非常感谢伙计。它成功了。请允许我向您解释如何使用 put 更新数据,因为它没有按我的预期工作。
  • 我只是得到状态码 400,更新时没有变化
  • 请有任何想法
  • 如果你能同时发布就太好了
  • 有任何回应吗?
【解决方案2】:
  <?php

  defined('BASEPATH') OR exit('No direct script access allowed');

   require APPPATH . '/libraries/REST_Controller.php';

  class Cities extends REST_Controller{

public function __construct() {
            parent::__construct();
            $this->load->model('cities_model');
}    
public function index_get(){
   $cities=$this->cities_model->get();
   if(!is_null($cities))
   {
   $this->response(array('response'=>$cities),200);
   }
   else
   {
   $this->response(array('error'=>'cities cannot be found...'),404);
   }

    }

     public function find_get($id){
   if(!$id)
   {
   $this->respose(null,400);
   }
   $cit=$this->cities_model->get($id);
   if(!is_null($cit))
   {
   $this->response(array('response'=> $cit),200);
   }
   else{
   $this->response(array('error'=> 'data could not be found...'),404);

   }
   }

    public function index_post(){

// Use validation library, instead of checking just for value.
$this->load->library('form_validation');
$this->form_validation->set_rules('city','City','trim|required');

if($this->form_validation->run() == FALSE)
{
    // send back list of validation errors.
    $this->response($this->validation_errors(),REST_Controller::HTTP_BAD_REQUEST);
}

$id=$this->cities_model->save($this->post('city'));
if(!is_null($id))
{
    $this->response(array('response'=> $id),REST_Controller::HTTP_OK);
}
else
{
    $this->response(array('error'=> 'sorry, data could not be saved...'),REST_Controller::HTTP_BAD_REQUEST);
}
 }
 public function index_put(){
// for put you need to pass id as parameter 

// Use validation library, instead of checking just for value.
$this->load->library('form_validation');
$this->form_validation->set_rules('id','ID','trim|required|integer');
$this->form_validation->set_rules('city','City','trim|required');

if($this->form_validation->run() == FALSE)
{
    // send back list of validation errors.
    $this->response($this->validation_errors(),REST_Controller::HTTP_BAD_REQUEST);
}

$update=$this->cities_model->update($this->post('id'),$this->post('city'));
if(!is_null($update))
{
    $this->response(array('response' => 'content updated successfully'),REST_Controller::HTTP_OK);
}
else
{
    $this->response(array('error'=> 'sorry, technical error occurred, please try again later...'), REST_Controller::HTTP_BAD_REQUEST);
    }
     }
     public function index_delete($id){
   if(!$id)
   {
   $this->response(null,400);
   }
   $del=$this->cities_model->delete($id);
   if(!is_null($del))
   {
   $this->response(array('response'=> 'item successfully deleted'),200);

   }
   else{
   $this->response(array('error'=> 'delete operations could not be done...'),400);
   }
    }
    }

这是模型文件:

 <?php
  class Cities_model extends CI_Model
 {
 public function __construct()
 {
  parent::__construct();

 }
 public function get($id=null)
 {
 if(!is_null($id))
 {
  $query=$this->db->select('*')->from('cities')->where('id',$id)->get();
  if($query->num_rows()===1)
   {
   return $query->row_array();
   }
   return null;
   }
   $sql=$this->db->select('*')->from('cities')->get();
   if($sql->num_rows()>0)
  {
   return $sql->result_array();
  }
  return null;
  }
  public function save($city)
 {
 $this->db->insert('cities', array('name'=>$city));
 if($this->db->affected_rows()>0)
 {
 return $this->db->insert_id();
 }
 return null;
 }
 public function update($id, $city)
 {
    $this->db->where('id',$id)->update('cities',$this->setCity(array('name'=>$cit‌​y,'id'=> $id)));

    if ($this->db->affected_rows() === 1) {
        return true;
    }
    return false;
}
 private function setCity($city)
 {
 return array('id'=>$city['id'],
         'name'=>$city['name']
         );
 }
 public function delete($id)
 { 
 $this->db->where('id',$id)->delete('cities');
 if($this->db->affected_rows()===1)
  {
 return true;
 }
  return false;
  }
  }

【讨论】:

  • 就是整个控制器
猜你喜欢
  • 2013-09-30
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2020-11-29
  • 2017-09-13
  • 1970-01-01
相关资源
最近更新 更多