将公共代码存储在单独的文件中


Storing common code in a separate file

我试图在separate文件中保留bindColumn语句和其他代码的长列表,并在需要的地方使用它们,而不是让它们污染主代码。我创建了一个名为 stock.php 的文件,并将所有bindColumn语句放入其中,并将它们包含在每个页面上。不知何故,我似乎没有做对,并且不断出现很多错误。

我怎么能做这样的事情?

select x, y, z, a, b, c from table;
$stmt->execute($array);
//Instead of writing all those bindColumn statements here after the select, 
//I'd like to keep them in a seperate file and include them here. How?

//In a seperate file
function bindCols(){
    $x = '$stmt->bindColumn('x',$x);';
    $x = '$stmt->bindColumn('y',$y);';
    $x = '$stmt->bindColumn('z',$z);';
    $x = '$stmt->bindColumn('a',$a);';
    $x = '$stmt->bindColumn('b',$b);';
    $x = '$stmt->bindColumn('c',$c);';
    $x = '$stmt->bindColumn('d',$d);';
    return $x;
}

有了更多信息,我可以为您制作更完整的示例...

   $params['calories'] = 150;
   $params['colour'] = 'red';

   $stmt = $dbh->prepare('SELECT name, colour, calories
                          FROM fruit
                          WHERE calories < :calories AND colour = :colour'); 
   bindColumns($stmt,$params); 
   $stmt->execute();
   function bindColumns(&$stmt, $params)
   {
      foreach($params as $key => $value)
      {
         $stmt->bindValue(":$key", $value); 
      } 
   }

快速说明:
* bindParam() 需要通过引用
获取其值* 绑定值() 不


好。。。所以绑定之后:

   $params = array('name','color','calories');
   $stmt = $dbh->prepare('SELECT name, color, calories FROM fruit');  
   $stmt->execute();   
   foreach($params as $index => $name) {  
      $stmt->bindColumn("$name", $$name);  
   }   
   while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
      print $name . "'t" . $color . "'t't" . $calories . "<br/>"; 
   }

这使用称为变量变量的东西来制作动态变量名称($$name)...几乎像extract()功能一样。 问题是...如果我将foreach($params...放入其自己的函数中,它们将在该函数的范围内丢失。 唯一的替代方法是使它们成为数组,并通过引用传入或返回它。 如果你这样做,你会使用print $return_params['name']或其他东西。

   $stmt = $dbh->prepare('SELECT name, color, calories FROM fruit');  
   $success = $stmt->execute();   
   $return = bindColumnsAfterSelect($stmt, $params); 
   while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
      print $return['name'] . "'t" . $return['color'] . "'t't" . $return['calories'] . "<br/>"; 
   }

   function bindColumnsAfterSelect(&$stmt, $params)
   {     
      $return = array(); 
      foreach($params as $index => $name) {  
         $stmt->bindColumn("$name", $return[$name]);  
      }  
      return $return; 
   }

而且......你不需要让所有东西都命名相同......你可以做:

   $params = array('name'=>'fruit_name','color'=>'fruit_color','calories'=>'fruit_calories');

然后。。。

   foreach($params as $table_name => $variable_name) {  
       $stmt->bindColumn("$table_name", $$variable_name);  
   }  

安南...我真的不使用 PDO,所以我不确定你到底在做什么,但这个 SO 帖子对你来说可能是一个更简单的选择? 邓诺。 下面是该页面的代码示例:

while( $row = $stmt->fetch(PDO::FETCH_ASSOC) ) {
    extract($row);
    echo $name;
    // etc
}

再次编辑:这就是你想要的。但我真的,真的,真的不会这样做。

   $stmt = $dbh->prepare('SELECT name, color, calories FROM fruit');  
   $success = $stmt->execute();   
   $return = bindColumnsAfterSelect(); 
   eval($return);  // this is a bad function to use like this.  
                   // it does what you want but... it's just not right
                   // it's extremely powerful and shouldn't be used
                   // for things like this... 
   while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
      print $name . "'t" . $color . "'t't" . $calories . "<br/>"; 
   }
   function bindColumnsAfterSelect()
   {     
      $x  = '$stmt->bindColumn("name", $name);';
      $x .= '$stmt->bindColumn("color", $color);';
      $x .= '$stmt->bindColumn("calories", $calories);'; 
      return $x; 
   }