我正在为我的公司项目编写数据库api。
我们在数据库api中有4个类。
这是我调用类方法的页面
<?php
include_once "config.php";
foreach($_REQUEST as $key=>$value){
$$key=$value;
}
if($pagelength=='')$pagelength=10;// default page length
//because by username can update the other users data
if($username!='' && $command!='saveuser'){
$user=User::getuserarray($username);
$userid=$user['userid'];
}
if($isowner!=''){
$user=User::getuserarray($isowner);
$userid=$user['userid'];
}
$users = array (
"userid" => $userid,
"username" => $username,
"firstname" => $firstname,
"lastname" => $lastname,
"password" => $password,
"email" => $email,
"photo" => '',
"url" => $url,
"avatar_url" => $avatar_url,
"thumb" => $thumb,
"crop_url" => $crop_url,
"crop_position" => $crop_position
);
$getcard=array(
'cardid'=>$cardid,
'card_type'=>$card_type,
'status'=>$status,
'userid'=>$userid,
'userid_to'=>$userid_to,
'message'=>$message,
'name'=>$name,
'pagelength'=>$pagelength,
'pagenumber'=>$pagenumber,
'fields'=>$fields
);
$getuser=array(
'userid'=>$userid,
'name'=>$name,
'pagelength'=>$pagelength,
'pagenumber'=>$pagenumber,
'fields'=>$fields
);
$getgib=array(
'gibid'=>$gibid,
'userid'=>$userid,
'isowner'=>$isowner,
'description'=>$description,
'tagline'=>$tagline,
'name'=>$name,
'pagelength'=>$pagelength,
'pagenumber'=>$pagenumber,
'fields'=>$fields
);
$getlink=array(
'gibid'=>$gibid,
'view'=>$view,
'userid'=>$userid,
'cardid'=>$cardid,
'name'=>$name,
'pagelength'=>$pagelength,
'pagenumber'=>$pagenumber,
'fields'=>$fields
);
switch($command){
case 'login':
$user=new User(array());
$msg=$user->login($username,$password);
break;
case 'logout':
$user=new User(array('userid'=>$userid));
$user->logout($id_session);
break;
//~ case 'isowner':
//~ $gib=new Gib(array('gibid'=>$gibid));
//~ $user=new User(array('userid'=>$userid));
//~ if($user->validateUserid()!=true) return $msg;
//~ if($gib->validateGibid()!=true) return $msg;
//~ $msg=$gib->isowner($userid,$gibid);
//~ break;
case 'saveuser':
$user=new User($users);
if($userid==''){
//checking if blank fields
$msg=$user->validate();
if($msg!='ok')break;
$msg=$user->adduser();
}else{
$msg=$user->updateuser();
}
break;
//~ case 'updateuser':
//~ $user=new User($users);
//~ $user->updateuser();
//~ break;
case 'changepassword':
$user=new User($users);
$msg=$user->changepassword($old_pswd,$new_pswd,$confirm_pswd);
break;
case 'changeimage':
$user=new User($users);
$user->changeimage($thumb,$url,$avatar_url,$crop_position,$crop_url);
break;
case 'getuser':
$user=new User(array('userid'=>$userid));
$msg=$user->getuser($getuser);
break;
/*----------link command -----------*/
case 'getlink':
$connection=new Connection(array());
$connections=$connection->getlink($getlink);
$connections=array('links'=>$connections);
echo $msg=json_encode($connections);
break;
case 'createlink':
$user=new User($users);
$msg=$user->validateUserid();
if($msg!='ok') break;
$connection=new Connection(array());
$msg=$connection->createlink($getlink);
break;
case 'updatelink':
$connection=new Connection(array('linkid'=>$linkid));
$msg=$connection->validate();
if($msg!='ok')break;
$connection->updatelinkposition($positionx,$positiony);
break;
case 'deletelink':
$connection=new Connection(array('linkid'=>$linkid));
$msg=$connection->validate();
if($msg!='ok')break;
$connection->deletelink();
break;
//~ case 'cardsend_validate':
//~ $card=new Card(array('cardid'=>$cardid));
//~ $msg=$card->cardSendValidate($userid_to);
//~ break;
case 'getcard':
$card=new Card(array('cardid'=>$cardid));
$cards=$card->getcardlist($getcard);
if($cardid=='')
echo $msg=$cards;
else
echo $msg=json_encode($cards);
break;
case 'givecard':
$card=new Card(array('cardid'=>$cardid));
$msg=$card->validate();
if($msg!='ok')break;
$user=new User(array('userid'=>$userid_to));
$msg=$user->validateUserid();
if($msg!='ok') break;
$msg=$card->givecard($getcard);
break;
case 'cardar'://accept reject
$card=new Card(array('cardid'=>$cardid));
$msg=$card->validate();
if($msg!='ok')break;
$msg=$card->acceptReject($getcard);
break;
case 'deletecard':
$card=new Card(array('cardid'=>$cardid));
$msg=$card->validate();
if($msg!='ok')break;
$msg=$card->delete_card();
break;
case 'getgib':
$gib=new Gib(array('gibid'=>$gibid));
$gibs=array('success'=>true,'gibs'=>$gib->getgibs($getgib));
echo $msg=json_encode($gibs);
break;
case 'savegib':
$gib=new Gib(array('gibid'=>$gibid));
$user=new User($users);
$msg=$user->validateUserid();
if($msg!='ok') break;
if($gibid==''){
$gibA=$gib->creategib($name,$type,$userid,$description,$tagline,$gib_background);
$gibid=$gibA['gibid'];
$gib->gibid=$gibid;
$msg= 'gib created Successfully';
}else{
$gib->updategib($name,$description,$tagline,$gib_background);
$msg= 'update Form submission complete';
}
$arrayjson1=array(
'success' => true,
'message'=>$msg
);
$gibA=$gib->getDetail();
echo $msg= formjson(array(),$gibA,$arrayjson1);
break;
default:
break;
}
?>
<script language="javascript">
window.location.href="enterspace.php?msg=<?php echo urlencode($msg); ?>";
</script>
这里我只向您展示建议的用户类
<?php
Class User{
var $userid;
var $username;
var $firstname;
var $password;
var $email;
var $photo;
var $avatar;
var $thumbnail;
var $crop_url;
var $crop_position;
function User($users){
$this->userid=$users['userid'];
$this->username= $users['username'];
$this->firstname=$users['firstname'];
$this->lastname=$users['lastname'];
$this->password= $users['password'];
$this->email=$users['email'];
$this->photo= $users['photo'];
$this->avatar= $users['avatar'];
$this->thumbnail= $users['thumbnail'];
$this->crop_url= $users['crop_url'];
$this->crop_position= $users['crop_position'];
}
function validateUserid(){
if($this->userid==''){
$msg=geterrormsg(1);
$arrayjson1=array(
'success' => false,
'message'=>$msg,
'error_code'=>'1');
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
$sql="select count(*) from users where userid=?";
$count=Db::getValue($sql,$this->userid);
//User not exist
if($count<=0){
$msg=geterrormsg(1);
$arrayjson1=array(
'success' => false,
'message'=>$msg,
'error_code'=>'1');
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
return 'ok';
}
function validate(){
//checking if blank fields
if($this->firstname=='' or $this->lastname=='' or $this->password=='' or $this->email=='' or $this->username==''){
$msg=geterrormsg(6);
$arrayjson1=array(
'success' => false,
'message'=>$msg,
'error_code'=>'6'
);
echo $msg= formjson(array(),array(),$arrayjson1);
return false;
}
if($this->userid==''){
$totalUsers = Db::getValue('SELECT COUNT(username) FROM users where username = ?',$this->username);
if($totalUsers>0){
//username already exist
$msg=geterrormsg(5);
$arrayjson1=array(
'success' => false,
'message'=>$msg,
'error_code'=>'6'
);
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
$totalUsers = Db::getValue('SELECT COUNT(email) FROM users where email = ?',$this->email);
if($totalUsers>0){
$msg=geterrormsg(4);
//email already exist
$arrayjson1=array(
'success' => false,
'message'=>$msg,
'error_code'=>'4'
);
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
}
return 'ok';
}
function login($loginUsername,$loginpassword){
//query for checking user username exist or not
$sql="select count(*) from users where username=?";
$count=Db::getValue($sql,$loginUsername);
if($count<=0){
$msg=geterrormsg(1);
$arrayjson1=array(
'success' => false,
'message'=>$msg,
'error_code'=>'1'
);
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
$sql="select AES_DECRYPT(password,'text') as password,userid from users where username=?";
$row=Db::getRow($sql,$loginUsername);
if(is_array($row)) extract($row);
$this->userid=$userid;
//for checking password
if($loginpassword != $password){
$msg=geterrormsg(2);
$arrayjson1=array(
'success' => false,
'message'=>$msg,
'error_code'=>'2'
);
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
//query for checking user exist in session table with status =1
//~ $ses_id = session_id();
//~ $_SESSION['username']=$loginUsername;
//~ $_SESSION['userid']=$userid;
//~ $sql="DELETE FROM sessions WHERE userid=? or id_session=?";
//~ Db::execute($sql,array($userid,$ses_id));
//~ $sql="INSERT INTO sessions (id_session, userid, START,
//~ END, STATUS, last_update ) VALUES (?, ?,current_timestamp, 'end', '1', current_timestamp );";
//~ Db::execute($sql,array($ses_id,$userid));
$gibid=$this->getDefaultGibId();
//making user array
$row=$this->getDetail();
unset($row['updatedon'],$row['createdon']);
$gib=new Gib(array('gibid'=>$gibid));
//~ $gibs=$gib->getgibs($userid,'',5);
$systemgibid=$gib->systemgibid();
$arrayjson1=array(
'success' => true,
'message'=>'User logged in successfully',
'gibid'=>$gibid,
'systemgibid'=>$systemgibid
);
echo $msg= formjson(array(),$row,$arrayjson1);
return $msg;
}
function getDefaultGibId(){
$sql="SELECT referid FROM cards WHERE userid_from=? AND userid_to=? and card_type='A' " ;
$gibid=Db::getValue($sql,array($this->userid,$this->userid));
return $gibid;
}
//making user array
function getDetail(){
$sql="select * from users where userid=?";
$row=Db::getRow($sql,$this->userid);
unset($row['password']);
return $row;
}
// for creating new user
// will have one user entry , one profile card entry in card table , one system gib
function adduser(){
$sql = "INSERT INTO users (username, firstname, lastname, PASSWORD,email,createdon )
VALUES (?, ?, ?, AES_ENCRYPT(?,'text'),?,current_timestamp);";
Db::execute($sql,array($this->username, $this->firstname, $this->lastname,$this->password,$this->email));
$this->userid=Db::getLastInsertId();
//make profile card in cards table...
$sql="INSERT INTO cards( userid_from, userid_to,card_type, referid,status,createdon)VALUES(?, ?, ?, ?, ?,current_timestamp)";
Db::execute($sql,array($this->userid,$this->userid,'V',$this->userid,'A'));
$id_card=Db::getLastInsertId();
$gib=new Gib(array());
$systemgibid=$gib->systemgibid();
//make system gib card in cards table...
$sql="INSERT INTO cards(userid_from, userid_to, referid,
card_type ,status,createdon)VALUES(?, ?, ?,?,?,current_timestamp )" ;
Db::execute($sql,array($this->userid,$this->userid,$systemgibid,'A','A'));
$this->firstname=$this->firstname."'s Gib";
//create gibs define in connection.php type D for default gib
$gib->creategib($this->firstname,'D',$this->userid,'','');
$arrayjson=array();
$row=$this->getDetail();
$arrayjson1=array(
'success' => true,
'message'=>'Registered in successfully',
'username'=>$this->username
);
echo $msg= formjson($arrayjson,$row,$arrayjson1);
return $msg;
}
function updateuser(){
$sql="UPDATE users SET firstname = ?, lastname = ?, email=? WHERE userid = ? ";
Db::execute($sql,array($this->firstname,$this->lastname,$this->email,$this->userid));
$user=$this->getDetail();
$arrayjson1=array(
'success' => true,
'message'=>'form submission complete'
);
echo $msg= formjson(array(),$user,$arrayjson1);
return $msg;
}
function changepassword($old_pswd,$new_pswd,$confirm_pswd){
$sql="select count(*) from users where password=AES_ENCRYPT(?,'text') and userid=? ";
$count=Db::getValue($sql,array($old_pswd,$this->userid));
if($count<=0){
$msg=geterrormsg(28);
//old passwod not matched
$arrayjson1=array(
'success' => false,
'message'=>$msg,
'error_code'=>'28'
);
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
//checking confirm and new password
if($new_pswd!=$confirm_pswd){
$msg=geterrormsg(29);
$arrayjson1=array(
'success' => false,
'message'=>$msg,
'error_code'=>'29'
);
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
$sql="UPDATE users SET PASSWORD = AES_ENCRYPT(?,'text')
WHERE userid = ? ; ";
Db::Execute($sql,array($new_pswd,$this->userid));
$arrayjson1=array(
'success' => true,
'message'=>'password changed successfully .',
'userid'=>$this->userid
);
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
function changeimage(){
$sql="UPDATE users SET thumbnail=? ,url=?, avatar=?,crop_position=?, crop_url=? WHERE userid = ? ";
Db::Execute($sql,array($this->thumbnail,$this->url,$this->avatar,$this->crop_position,$this->crop_url,$this->userid));
$user=$this->getDetail();
$arrayjson1=array(
'success' => true,
'message'=>'form submission complete'
);
echo $msg= formjson(array(),$user,$arrayjson1);
}
function logout($id_session){
//~ $sql="delete from sessions where userid=? and id_session=?";
//~ Db::Execute($sql,array($this->userid,$id_session));
//~ $sql="delete from occupants where userid=?";
//~ Db::Execute($sql,$this->userid);
//~ unset($_SESSION['username']);
//~ session_destroy(); // start up your PHP session!
//~ echo $msg= "{'success': 'true','message':'logout successfully','userid':'$userid'}";
return $msg;
}
function getuser($getuser){
$userid=$getuser['userid'];
$name=$getuser['name'];
$pagelength=$getuser['pagelength'];
$pagenumber=$getuser['pagenumber'];
$fields=$getuser['fields'];
$condition = '';
$query=array();
if($userid !='') {
$condition .= " and userid=? ";
array_push($query,$userid);
}
if($name!=''){
$condition .= " and concat_ws(' ',firstname,lastname) like ?";
array_push($query,"%".$name."%");
}
if($pagelength!=''){
$limitpagelength="limit $pagelength";
}
if($pagenumber!=''){
$pagenumber=$pagelength*($pagenumber-1);
$pagenumber="offset $pagenumber";
}
if($fields=='*'){
$fields=",users.*";
}elseif($fields!=''){
$fields=",".$fields;
}
$sql="select userid,concat_ws(' ',firstname,lastname) as name $fields
from users where 1=1 $condition order by updatedon $limitpagelength $pagenumber";
$row=Db::getResult($sql,$query);
$user=array();
for($i=0;$i<count($row);$i++){
unset($row[$i]['password']);
extract($row[$i]);
$this->userid=$userid;
$row[$i]['gibid']=$this->getDefaultGibId();
array_push($user,$row[$i]);
}
$arrayjson1=array(
'success' => true,
'message'=>'User data successfully',
'users'=>$user
);
echo $msg= formjson(array(),array(),$arrayjson1);
return $msg;
}
//making user array
function getuserarray($username){
$sql="select * from users where username=?";
$row=Db::getRow($sql,$username);
unset($row['password']);
return $row;
}
}
?>
请建议我如何通过实现高级和所有oops概念来改进我的代码。 如果您发现此问题含糊不清,请提出改进建议。 谢谢
答案 0 :(得分:2)
此
foreach($_REQUEST as $key=>$value){
$$key=$value;
}
可以缩短为
extract($_REQUEST);
然而,这样做是不安全的,原因有两个:
$_REQUEST
is insecure unless you know the order in which data was merged into it 由于您已经在进行OOP,我建议在您的应用程序中引入一个Request
对象,并通过它的API访问任何Request参数。不要将Request数据提取到数组子集中,只需将整个Request对象传递给任何需要它的函数或方法,例如:而不是
$connections = $connection->getlink($getlink);
DO
$connections = $connection->getlink($request);
除此之外,@ mario与replacing that switch/case block有一个很好的关系。基本上,您显示的代码是FrontController,它根据收到的输入确定接下来要做什么。因此,您可以将所有这些命令字符串设置为classes of their own,例如
class LoginCommand
class SaveUserCommand
…
然后只是实例化命令和run an interface method,例如所有这些命令必须在实例上实现的方法。然后你可以用
替换你的开关/盒子$request = new Request($_GET, $_POST);
$commandClass = $request->getCommand() . 'Command';
$commandInstance = new $commandClass($request);
$commandInstance->execute();
由于您有几个命令处理相同的对象,例如“getLink”和“createLink”都可以在Connection
上运行,您可能还需要考虑将这些相关命令分组到PageController。
是否引入第二个参数“controller”来执行此类操作
$controllerClass = $request->getController();
$controller = new $controllerClass($request);
call_user_func(array($controller, $request->getCommand()));
或使用路由器将命令映射到控制器中的适当方法
$router = new Router('routes.ini');
$controllerClass = $router->mapCommandToControllerClass($request);
$controller = new $controllerClass($request);
call_user_func(array($controller, $request->getCommand()));
取决于你。
如果你这样做,你已经非常接近MVC(而忽略了它是MVP还是HMVC的狡辩,因为它在网上)。所有这些中最重要的因素是将业务逻辑与表示层分开。
我不会对您的课程发表评论,除非我不相信ActiveRecord,并且认为您应separate the code queries the database来自对数据进行业务操作的代码Code Convention like PEAR在这些课程中。
最后,我发现你的代码缺少空格而难以阅读。考虑遵循PHP_CodeSniffer。并使用{{3}}确保您遵循该约定。
免责声明:以上均不属于生产代码。这些只是让您了解如何改进应用程序架构的示例。
答案 1 :(得分:0)
两件事。从ArrayObject派生User类(也可能是其他类),可能使用ArrayObject :: ARRAY_AS_PROPS。这样就可以按原样使用数据,可以保存手动属性填充。
class User extends ArrayObject {
function User($users) { // __construct
parent::__construct($users, 2);
这样您就可以访问$ this [“username”]和$ this-&gt;用户名等。可能会在其他地方受益。
对于第一个脚本,尝试用类和方法替换冗长的开关。您可以使用call_user_func(array("modules", $command))
来调用它们。
赞成使用预准备语句,顺便说一下!