2013-04-11 63 views
1

我是mysqli的新手,我写了一个函数如下。mysqli和提取数据

1 -我不能为SELECT *查询找到一种方式,并具有bind_result每一列的值同名变量分配。 (#row存储到$name例如name列值)

我认为bind_result()有一个SELECT *查询中没有功能?

2 -所以我尝试了另一个选项,获取所有行并通过循环手动将它们分配给适当的变量。我想我应该用$query->fetch_all()$query->fetch_assoc()的循环,但我有这种遭遇:

Fatal error: Call to undefined method mysqli_result::fetch_all()

Fatal error: Call to undefined method mysqli_result::fetch_assoc()

但是我做了phpinfo()只见启用mysqlnd和PHP的版本是5.4 .7(运行XAMPP v1.8.1)

and 3-最后我确实也是不起作用的想法。

function the_names($name) 
{ 
    global $db; 
    if($query = $db->prepare("SELECT * FROM users where name=?")) 
    { 
     $query->bind_param('s', $name); 
     if($query->execute()) 
     { 
      $query->store_result(); 
      if($query->num_rows > 1) 
      { 
       while($row = $query->fetch()) 
       { 
        echo $row['name']; // Here is the problem 
       } 
      } 
      else 
       echo "not valid"; 
      $query->close(); 
     } 
    } 
} 

我需要一种方法来存储所有获取的数据作为什么bind_result()呢,还是让他们为以后使用数组,这是更好的了解两者。 TNX

回答

1

一个字来回答你所有的问题一次 - PDO
它拥有你想从mysqli的(白白)的一切:

function the_names($name) 
{ 
    global $db; 
    $query = $db->prepare("SELECT * FROM users where name=?"); 
    $query->execute(array($name)); 
    return $query->fetchAll(); 
} 

$names = the_names('Joe'); 
foreach ($names as $row) { 
    echo $row['name']; 
} 

注意使用功能的正确方法。应该从来没有呼应什么,但只返回数据为将来使用

+1

那么创建了什么mysqli! – revo 2013-04-11 15:34:31

+0

哦,是的,意图都很好。但实施变成了一场噩梦。所以你可以从你面临的问题中看出来。 – 2013-04-11 15:44:31

+0

很好的回答,我正在开关! @revo如果它回答了您的问题,那么接受一个答案(带有该复选标记)是一种很好的做法 – michaellindahl 2013-08-20 03:01:02

0

如果您mysqli的代码没有binding_param()你可以只写代码象下面这样:

$mysqli = new mysqli("localhost" , "root" , "" , "database_name"); 
$result = $mysqli->query("SELECT * FROM users where name=" . $name) ; 
while ($row = $result->fetch_assoc()) { 
    echo $row["name"]; 
} 

如果使用binding_param()代码,您还需要设置bind_result()

$db = new mysqli("localhost" , "root" , "" , "database_name"); 
function the_names($name){ 
    global $db; 


    /* Prepared statement, stage 1: prepare */ 
    if (!($query = $db->prepare("SELECT * FROM users where name=?"))) { # prepare sql 
    echo "Prepare failed: (" . $db->errno . ") " . $db->error; 
    } 


    /* Prepared statement, stage 2: bind and execute */ 
    if (!$query->bind_param("s", $name)) { # giving param to "?" in prepare sql 
     echo "Binding parameters failed: (" . $query->errno . ") " . $query->error; 
    } 

    if (!$query->execute()) { 
     echo "Execute failed: (" . $query->errno . ") " . $query->error; 
    } 


    $query->store_result(); # store result so we can count it below... 
    if($query->num_rows > 0){ # if data more than 0 [ that also mean "if not empty" ] 

     # Declare the output field of database 
     $out_id = NULL; 
     $out_name = NULL; 
     $out_age = NULL; 
     if (!$query->bind_result($out_id, $out_name , $out_age)) { 
      /* 
      * Blind result should same with your database table ! 
      * Example : my database 
      * -users 
      * id ( 11  int) 
      * name (255 string) 
      * age ( 11  int) 
      * then the blind_result() code is : bind_result($out_id, $out_name , $out_age) 
      */ 
      echo "Binding output parameters failed: (" . $query->errno . ") " . $query->error; 
     } 

     while ($query->fetch()) { 
      # print the out field 
      printf("id = %s <br /> name = %s <br /> age = %s <br />", $out_id, $out_name , $out_age); 
     } 

    }else{ 
     echo "not valid"; 
    } 

} 
the_names("panji asmara"); 

参考:

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php