2014-06-12 36 views
0

我在常规的位置运行类似于以下脚本的脚本,其中删除了前导字符,然后在字符后删除了字符串的其余部分,但我注意到在加载我最近页,我想知道是否有人能告诉我如何优化的东西作为优化ltrim和strpos

$user_image =""; 
$sqlimage ="SELECT * FROM `sys_users` WHERE `username`='sample'"; 
$dataimage = sql_fetch($sqlimage); 

(而这正是我操纵数据

$user_image=$dataimage[0]["image"]; 
$user_image = substr($user_image, 1); 
list($user_image)= explode('|', $user_image); 
if (sys_is_super_admin($_SESSION["username"])) $user_image = '/ext/icons/placeholder.gif'; 
$_SESSION["user_image"] = $user_image; 

为例

+0

1)上述代码运行的频率如何? 2)如果您使用'microtime()'计时上述代码,需要多长时间? 3)你索引了'sys_users'吗? –

+0

@ Mr.Llama回答1)代码每天运行约200次,但这种代码每天运行约1500次2)花费大约0.089-0.1秒3)它被编入索引 – Faruq

回答

0

首先,你不需要使用你的数据库,如果你是super_admin,以及我可以读...

然后,也许你可以使用strpos找到你的第一个字符限制的索引(在你的例子中管),并将其用作substr的长度参数。

我可以建议你这个片段:

function setSessionUserImage() 
{ 
    if (sys_is_super_admin($_SESSION['username'])) { 
     $_SESSION['user_image'] = '/ext/icons/placeholder.gif'; 
     return; 
    } 

    // $mysqli is your instance of mysql connection (from mysqli native PHP class) 
    $stmt = $mysqli->stmt_init(); 
    if ($stmt->prepare("SELECT * FROM `sys_users` WHERE `username`= ?")) { 
     $stmt->bind_param('s', $_SESSION['username']); 
     $stmt->execute(); 
     $stmt->bind_result($dataimage); 
     $stmt->fetch(); 
     if (!empty($dataimage[0]) && !empty($dataimage[0]['image'])) { 
      $user_image = $dataimage[0]['image']; 
      // Here, add -1 for the strpos because you're removing the 1st char, shifting the string 
      $_SESSION['user_image'] = substr($user_image, 1, strpos($user_image, '|') - 1); 
     } 
    } 
    return; 
} 

当然,这个段假定有一个管到您从查询得到的数据......你需要检查所有的错误情况下,明智地管理它们。

+0

管道的两端都有字段图像,我也误写了sql_fetch,它应该是'username' ='$ username',有一段时间让语法正确。你能编辑你的答案来反映这一点吗?我也喜欢你的想法,把它变成一个单独的功能,并相应地调用它。所以我会写setSessionUserImage($ username);在它的地方只有(?) - 你是正确的超级管理员不需要数据库,这将是如果(sys_is_super_admin($ username)){或$ _SESSION [“用户名”] – Faruq

+0

如果你想使用存储在你的$ _SESSION中的用户名,不需要为你的函数添加一个参数。另外,请注意SQL注入。我不知道你是否使用mysqli,PDO或其他东西,因为sql_fecth不是本地PHP函数。 – niconoe

+0

谢谢,是的,sql_fetch是一个支持多个数据库的命令,所以我们使用mysqli,但是如果设置了另一个数据库,那么它们可能是PDO。 – Faruq