使用Active Record Pattern执行查询INSERT INTO时出错

时间:2012-10-05 18:03:57

标签: php mysql activerecord

我正在尝试用PHP实现Active Record Pattern;我有以下代码

<?php

// define 'MySQL' class
class users{
  private $result;

  public function __construct($host='localhost',$user='user',$password='password',$database='pruebalabo'){
    // connect to MySQL and select database
    if(!($conId = @mysql_connect("127.0.0.1","root",""))){
       throw new Exception('Error connecting to the server');
    }
    if(!mysql_select_db("pruebalabo",$conId)){
       throw new Exception('Error selecting database');
    }
  }

  // run SQL query
  public function query($query){
    if(!$this->result=mysql_query($query)){
      throw new Exception('Error performing query '.$query);
    }
  }
  // fetch one row
  public function fetchRow(){
    while($row=mysql_fetch_array($this->result)){
      return $row;
    }
    return false;
  }
  // fetch all rows
  public function fetchAll($table='users'){
     $this->query('SELECT * FROM '.$table);
     $rows=array();
     while($row=$this->fetchRow()){
        $rows[]=$row;
     }
     return $rows;
  }
  // insert row
  public function insert($params=array(),$table='default_table'){
     $sql='INSERT INTO '.$table.' ('.implode(',', array_keys($params)).') VALUES ('.implode("','",array_values($params)).')';
     $this->query($sql);
  }

}


try{
  // connect to MySQL and select a database
  $db=new users("host","root","","pruebalabo");
  $result=$db->fetchAll('users');
  foreach($result as $row){
     echo $row['firstname'].' '.$row['lastname'].' '.$row['email'].'<br />';
  }

  // connect to MySQL and select a database
  $db=new users("127.0.0.1","root","","pruebalabo");
  // insert new row into selected MySQL table
  $db->insert(array('firstname'=>'Sebas','lastname'=>'Guajardo','email'=>'tururus@domain.com'),'users');

}

catch(Exception $e){
  echo $e->getMessage();
  exit();
}

?>

但是,当我尝试运行代码时,出现以下行的错误

$db->insert(array('firstname'=>'Sebas','lastname'=>'Guajardo','email'=>'tururus@domain.com'),'users');

我没有看到语法错误,我从this页面直接看了一下这个例子。我的数据库名称(在MySQL上实现)是'pruebalabo',表的名称是'用户'。

编辑:修正了错误指出。仍然有错误。

3 个答案:

答案 0 :(得分:2)

您的函数包含变量$firstname,但该变量不存在。当您将数组值内嵌到implode(',' , array_keys($params))列表中时,您似乎打算VALUES()提供数组键作为列名。

 public function insert($params=array(),$table='default_table'){
   // Pass the array keys as column names to match the VALUES().
   // I have surrounded them all in `backquotes` in the implode() here
   $sql="INSERT INTO ".$table." (`" . implode('`,`', array_keys($params)) . "`) VALUES ('".implode("','",array_values($params))."')";
   $this->query($sql);
 }

始终在mysql_query()来电中检查是否成功,并在失败时检查mysql_error()的输出。

注意:我们假设您安全地转义$params中的值,然后再将它们传递给您的查询,如果它们没有硬编码,就像它们在这个中一样。

答案 1 :(得分:1)

此功能

public function insert($params=array(),$table='default_table'){
     $sql='INSERT INTO '.$table.' ('.$firstName.') VALUES ('.implode("','",array_values($params)).')';
     $this->query($sql);
  }

使用未定义为“$ firstName”的变量,并注意您指定的值应与您在('。$ firstName。')中指定的列相对应。

将此代码用于该功能,问题似乎是缺少“'”字符:

$sql= "INSERT INTO $table (".implode(',', array_keys($params))
 .") VALUES ('".implode("','",array_values($params))."')"; 
$this->query($sql);

此致

答案 2 :(得分:1)

更改插入功能,如下所示

public function insert($params=array(),$table='default_table'){
     $sql='INSERT INTO '.$table.' ('.implode(',', array_keys($params)).') VALUES ('.'\''.implode("','",array_values($params)).'\''.')';
     $this->query($sql);
  }