2011-04-04 83 views
2

我有一个PHP函数,我希望将返回所有数据。现在的问题是,它会返回第一行然后挂出,我不知道为什么。如何从PHP函数返回mysql数据

function get_user_info($id,$field='') 
{ 
    //connect to database 
    include_once("../config.php"); 
    $qry= "SELECT `$field` FROM `".$user_table."` WHERE `id` ='$id'"; 
    //die($qry); 
    $result=mysql_query($qry); 
    if($result) { 
     if(mysql_num_rows($result)>0) { 
      //query successful 
      $data=mysql_fetch_row($result); 
      $user_info= $data[0]; 
     } 
     else{ 
      $user_info ="invalid field"; 
     } 

    } 
    else{ 
     $user_info="invalid data"; 
     } 
    return $user_info; 
} 

如果我运行状回声(get_user_info($user_id,'username')." ".get_user_info($user_id,'username'));它返回username invalid data对我的生活中,我想不通为什么它不会得到与get_user_data

编辑的每一行assocated数据的函数:似乎在$result=mysql_query($qry);返回不正确的表名“”被死亡

EDIT2:看起来像问题是,我只包括配置文件一次,并且使用一个变量我的表名在我第二次尝试打电话时未被设置。

编辑3: 这里是最后的功能

//connect to database 
if(file_exists('..config.php')){ 
    include_once("../config.php"); 
} 
function get_user_info($id,$field) 
{ 

    //get users table 
    global $user_table_name; 

    $qry= "SELECT `$field` FROM `$user_table` WHERE `id` ='$id'"; 
    $result=mysql_query($qry) or die(mysql_error()); 
    if($result) { 
     if(mysql_num_rows($result)>0) { 
      //query successful 
      $data=mysql_fetch_row($result); 
      $user_info= $data[0]; 
     } 
     else{ 
      $user_info =$qry; 
     } 

    } 
    else{ 
     $user_info="invalid data"; 
     } 
    return $user_info; 
} 
+0

回显查询,看看他运行了什么,如果你有错误显示,echo mysql_errno($ link)。 “:”。 mysql_error($ link)。 “\ n” 个; – 2011-04-04 07:12:24

+0

sql错误是“无效表”'“ – BandonRandon 2011-04-04 07:17:32

+0

所以,这不是你在这里发布的真实代码? – 2011-04-04 08:01:31

回答

1

那么我现在看到你在做什么。

首先,你有这样的功能的想法是绝对的辉煌。只有很少的人曾经来过它。
但是实现似乎不太好。

您正在尝试创建mysql helper函数和专用函数以一次获取特定用户数据。让我告诉你如何制作前者,然后看看是否需要后者。

每个PHP开发人员都需要像你这样的函数,但通用目的 - 从查询中获取单个值,而不用输入大量重复性的消毒参数代码,并获取数据和错误控制以及其他东西。
下面是这种功能的一个例子,使用占位符将数据传递到查询中。printf家族的这些占位符,所以,你必须使用%s来表示一个字符串,并%d代表int

function dbgetvar(){ 
    $args = func_get_args(); 
    $query = array_shift($args); 
    foreach ($args as $key => $val) { 
    $args[$key] = mysql_real_escape_string($val); 
    } 
    $query = str_replace("%s","'%s'",$query); 
    $query = vsprintf($query, $args); 

    $res = mysql_query($query); 
    if (!$res) { 
    trigger_error("dbgetarr: ".mysql_error()." in ".$query); 
    return FALSE; 
    } else { 
    $row = mysql_fetch_row($res); 
    if (!$row) return NULL; 
    return $row[0]; 
    } 
} 

在你的配置文件中这个功能,你可以得到你的用户信息这样

$name = dbgetvar("SELECT name FROM users WHERE id=%d",$_GET['id']); 

和其他许多像这样的事情

$name = dbgetvar("SELECT id FROM users WHERE name=%s AND surname = %s", 
       $_GET['name'], 
       $_GET['surname']); 

我怀疑你将需要专门的函数的n用于userinfo了。但是,它也可以做到,基于此功能

+0

真棒,我想我的专门功能的想法只是为了避免我的视图页面内的SQL查询,以保持清洁。 – BandonRandon 2011-04-04 23:08:32

+0

@Bandon在浏览页面中避免SQL查询是错误的想法。你的专业功能仍然属于业务逻辑,不应该在视图中。只有要显示的数据应该传递给视图,没有别的。 – 2011-04-05 05:02:34

3

使用

function mysql_fetch_all($res) { 
    while($row=mysql_fetch_array($res)) { 
     $return[] = $row; 
    } 
    return $return; 
} 

$data = mysql_fetch_all($result); 
+0

[参考](http://php.net/manual/en/function.mysql-fetch-row.php) – diEcho 2011-04-04 07:13:24

+0

@Bandon如果你只想选择字段,然后优化查询('SELECT用户名,user_id从')不是fetch方法 – diEcho 2011-04-04 07:16:59

+0

为什么做一个新的功能,当他可以返回结果集返回$ data – 2011-04-04 07:17:09

1

嗯,你只是因为$data=mysql_fetch_rows($result)获取数据的一行只给出d的第一行ata集。如果你想返回所有的数据,那么你需要用while循环来填充数据。

$data_arr= array(); 
while($data=mysql_fetch_assoc($result)){ 
    array_push($data_arr, $row); 
} 

然后,您可以从函数返回$data_arr

0

我承认在发布这个问题时我犯了一个错误。我没有发布在函数内部使用的变量。这个变量是造成这个问题的原因。该问题随函数的编辑3中包含连接包含工作形式的最终功能。

0

嗨我也遇到了一个非常类似的情况。 我已经做了一个自定义函数来从表中返回值。 如果字段存在或不存在,您也可以通过返回true来加强它。

function getuserinfo($table, $matchid, $uid, $field) 
{ 
    $sql=mysql_query("select $field from $table where $matchid=$uid"); 
    $row=mysql_fetch_array($sql); 
    $userinfo=$row[0]; 
    return $userinfo; 
} 

您可以用上面的功能是这样的: -

<?php echo getuserinfo('usertable', 'id', $userid, 'fullname'); 
echo getuserinfo('usertable', 'id', $userid, 'lastname'); 
?> 

随意评论。