0

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

<?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');

我没有看到语法错误,我几乎直接从这个页面中获取了这个例子。我的数据库(在 MySQL 上实现)的名称是“pruebalabo”,表的名称是“users”。

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

4

3 回答 3

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在将它们传递给您的查询之前安全地转义了这些值,以防它们没有像在这个中那样进行硬编码。

于 2012-10-05T18:06:18.823 回答
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);

问候

于 2012-10-05T18:08:45.430 回答
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);
  }
于 2012-10-05T18:18:41.037 回答