我正在尝试用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',表的名称是'用户'。
编辑:修正了错误指出。仍然有错误。
答案 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);
}