2011-12-24 138 views
-1

编辑:讨论here click here后,我决定使用弗朗西斯阿维拉的解决方案,它更安全,而且我没有找到一个方法来利用我的路,只有大家都说它的安全风险使用eval( )。如果您找到了方法,请利用我的方式,请发表评论。 :-),以便我了解它以及另一个使用eval的用户:-)创建动态数量的变量

还有一件事情不使用eval(),它比我想要的更慢。

编辑:

一个积极的事情,也就是在弗朗西斯阿维拉的解决办法是,你只需要特定的只有2瓦尔,$ SQL + $ INPUT,无需更多的弟弟$输出。

编辑:删除旧的问题,并用它替换它,所以你可能有一个更好的想法,我想要做什么。

我发现一个解决方案如何制作一个动态数量的变量,但它不是最优解决方案。因为我需要编辑/添加更多的线,如果变量的数量变得比8更高的那么有没有一种方法,使在开关功能上不要继电器,其动态

public function readDB($readdb, $input, $output1) { 

    $sql = $readdb; 
    $stmt = $this->mysqli->prepare($sql); 
    if(!empty($input) && is_array($input)) { 
     $inputn = count($input); 

     switch($inputn) { 
      case "1": 
       $stmt->bind_param('s', $input[0][0]); 
       break; 
      case "2": 
       $stmt->bind_param('ss', $input[0][0], $input[1][0]); 
       break; 
      case "3": 
       $stmt->bind_param('sss', $input[0][0], $input[1][0], $input[3][0]); 
       break; 
      case "4": 
       $stmt->bind_param('ssss', $input[0][0], $input[1][0], $input[3][0], $input[4][0]); 
       break; 
      case "5": 
       $stmt->bind_param('sssss', $input[0][0], $input[1][0], $input[3][0], $input[4][0], $input[5][0]); 
       break; 
      case "6": 
       $stmt->bind_param('ssssss', $input[0][0], $input[1][0], $input[3][0], $input[4][0], $input[5][0], $input[6][0]); 
       break; 
      case "7": 
       $stmt->bind_param('sssssss', $input[0][0], $input[1][0], $input[3][0], $input[4][0], $input[5][0], $input[6][0], $input[7][0]); 
       break; 
      case "8": 
       $stmt->bind_param('ssssssss', $input[0][0], $input[1][0], $input[3][0], $input[4][0], $input[5][0], $input[6][0], $input[7][0], $input[8][0]); 
       break; 
      default: 
       break; 
     } 
    } 
    if (!$stmt) {throw new Exception($mysqli->error);} 
    $stmt->execute(); 
    $stmt->store_result(); 
    $checker = $stmt->num_rows; 
    if($checker !== 0) { 
     if(!empty($output1)) { 
      switch($output1) { 
       case "1": 
        $stmt->bind_result($output[0]); 
        while ($stmt->fetch()) { 
         $results[] = array($output[0]); 
        } 
        break; 
       case "2": 
        $stmt->bind_result($output[0], $output[1]); 
        while ($stmt->fetch()) { 
         $results[] = array($output[0], $output[1]); 
        } 
        break; 
       case "3": 
        $stmt->bind_result($output[0], $output[1], $output[2]); 
        while ($stmt->fetch()) { 
         $results[] = array($output[0], $output[1], $output[2]); 
        } 
        break; 
       case "4": 
        $stmt->bind_result($output[0], $output[1], $output[2], $output[3]); 
        while ($stmt->fetch()) { 
         $results[] = array($output[0], $output[1], $output[2], $output[3]); 
        } 
        break; 
       case "5": 
        $stmt->bind_result($output[0], $output[1], $output[2], $output[3], $output[4]); 
        while ($stmt->fetch()) { 
         $results[] = array($output[0], $output[1], $output[2], $output[3], $output[4]); 
        } 
        break; 
       case "6": 
        $stmt->bind_result($output[0], $output[1], $output[2], $output[3], $output[4], $output[5]); 
        while ($stmt->fetch()) { 
         $results[] = array($output[0], $output[1], $output[2], $output[3], $output[4], $output[5]); 
        } 
        break; 
       case "7": 
        $stmt->bind_result($output[0], $output[1], $output[2], $output[3], $output[4], $output[5], $output[6]); 
        while ($stmt->fetch()) { 
         $results[] = array($output[0], $output[1], $output[2], $output[3], $output[4], $output[5], $output[6]); 
        } 
        break; 
       case "8": 
        $stmt->bind_result($output[0], $output[1], $output[2], $output[3], $output[4], $output[5], $output[6], $output[7]); 
        while ($stmt->fetch()) { 
         $results[] = array($output[0], $output[1], $output[2], $output[3], $output[4], $output[5], $output[6], $output[7]); 
        } 
        break; 
       default: 
       echo "HERE"; 
        break; 
      } 
     } 
    } else { 
     $results = "NO RESULTS"; 
    } 
    $stmt->fetch(); 
    $stmt->close(); 

    $this->checker = $checker; 
    $this->results = $results; 

    $this->result = array('num_rows' => $checker, $results); 

    return $this->results; 
+0

我不明白你的问题,真的。但你可以用另一个变量值来创建变量,如下所示:{$ var} = true – Zar 2011-12-24 19:42:54

+0

嗨,我更新了文本,如果你有时间可以看看它,也许你现在更好地理解它 – user1015314 2011-12-24 21:48:50

回答

2

如果你不是太深,我强烈建议您使用PDO,而不是库MySQLi因为库MySQLi API是可怕

你想要的其实很困难。下面是这表明你需要通过跳跃的篮球功能:

function query(MySQLi $db, $sql, array $data) { 
    $stmt = $db->prepare($sql); 
    if (!$stmt) return null; 
    $types = str_repeat('s', count($data)); 
    $args = array(); // references to values in $data for call_user_func_array 
    foreach ($data as $k => $v) { 
     $args[$k] =& $data[$k]; 
    } 
    array_unshift($args, $types); 
    call_user_func_array(array($stmt, 'bind_param'), $args); 
    $stmt->execute(); 
    // mysqlind driver 
    if (method_exists($stmt, 'get_result')) { 
     $res = $stmt->get_result(); 
     $rows = $res->fetch_all(MYSQLI_ASSOC); 
     $res->free(); 
    } else { // by hand, ugh! 
     $rows = array(); 
     $resultbinds = array(); // where results will end up 
     $args = array(); // references to $resultbinds for call_user_func_array 
     $meta = $stmt->result_metadata(); 
     while ($fieldmeta = $meta->fetch_field()) { 
      $resultbinds[$fieldmeta->name] = null; 
      $args[] =& $resultbinds[$fieldmeta->name]; 
     } 
     $meta->free(); 
     call_user_func_array(array($stmt, 'bind_result'), $args); 
     while ($stmt->fetch()) { 
      $row = array(); 
      // copy array to dereference 
      foreach ($resultbinds as $k => $v) { 
       $row[$k] = $v; 
      } 
      $rows[] = $row; 
     } 
    } 
    $stmt->free_result(); 
    $stmt->close(); 
    return $rows; 
} 

这是你会怎么做PDO同样的事情:使用PDO

function query_PDO($db, $sql, $data) { 
    $stmt = $db->prepare($sql); 
    $stmt->execute($data); 
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    $stmt->closeCursor(); 
    return $rows; 
} 

下面是如何连接到MySQL:

function connect_PDO() { 
    $host = 'localhost'; 
    $user = 'root'; 
    $pass = 'root'; 
    $dbname = 'scratch'; 
    $port = 8889; 
    $socket = '/Applications/MAMP/tmp/mysql/mysql.sock'; 
    $options = array(
     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
    ); 
    if (version_compare(PHP_VERSION, '5.3.6', '<')) { 
     $options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES utf8'; 
    } 
    $dsn = "mysql:host={$host};port={$port};unix_socket={$socket};dbname={$dbname};charset=utf8"; 
    return new PDO($dsn, $user, $pass, $options); 
} 
+0

嗨弗朗西斯,谢谢你的回答,我昨天晚上找到了,也是一个解决方案,带有准备好的陈述和使用eval();也许你可以检查我的答案,但我不知道eval函数,如果它可以被利用,谢谢你的帮助! – user1015314 2011-12-25 14:45:30

+0

不要使用评估 - 它是缓慢和危险的。只需使用PDO - mysqli会被大脑损坏,PDO功能更强大,更灵活,更易于使用,记录更完善,应用更广泛。 – 2011-12-25 16:50:41

+0

谢谢,因为指出它比较慢,还有一件事要离开eval()我接受你的答案,看来这是最好的方法。谢谢弗朗西斯!和快乐圣诞节。 – user1015314 2011-12-25 17:44:21

0

创建数组一个for循环

<?php 
    for($i = 1; $i <= [your value]; $i++) 
    { 
     $somearray[$i] = "your value"; 
    } 
?> 
+0

好吧,但现在,如何将此数组添加到 $ stmt-> bind_parm($ somearray [$ i],$ somearray [$ i]); 多数民众赞成我的主要问题:) – user1015314 2011-12-24 19:47:17

+0

尝试只传递一个空白或空的变量,如果没有第三个输入。 – 2011-12-24 20:02:12

+0

我更新了我的问题看看我想做什么 – user1015314 2011-12-24 21:49:03

1

编辑:讨论here click here后,我决定使用弗朗西斯阿维拉的解决方案,它更安全,而且我没有找到一个方法来利用我的路,只有大家都说它的安全风险使用eval() 。如果你找到方法,利用我的离开,请发表评论。 :-),以便我了解它,也是另一个用户,谁使用评估:-)

一个积极的事情,也是在弗朗西斯阿维拉的解决方案是,你只需要具体只有2个变量,$ SQL + $ INPUT, $输出不需要更多的兄弟。

我找到了一个解决方案: 概述:我使用了函数eval();

1.Step

$sql = "SELECT 1, 2, 3 FROM x WHERE b = ? LIMIT 10"; // SQL STATEMENT 
$input = array("10"); // b = ? from SQL STATEMENT 
$output = 3; // Number of variables need for 1, 2, 3 

2.Step

$data = readDB2($sql, $input, $output); 
var_dump($data); 


public function readDB2($sql, $input, $output1) { 

    $stmt = $this->mysqli->prepare($sql); 
    if(!empty($input) && is_array($input)) { 
     $sp = ""; 
     $data = ""; 
     $inputn = count($input) - 1; 
     for($i = 0; $i <= $inputn; $i++) { 
      if($i !== $inputn) { 
       $data .= '$input[' . $i . "],"; 
      } else { 
       $data .= '$input[' . $i . "]"; 
      } 
      $sp .= "s"; 
     } 
     $bind = '$stmt->bind_param(\''. $sp . '\',' . $data . ');'; 
     eval("return $bind"); 
    } 
    if (!$stmt) {throw new Exception($this->mysqli->error);} 
    $stmt->execute(); 
    if (!$stmt) {throw new Exception($this->mysqli->error);} 
    $stmt->store_result(); 
    $checker = $stmt->num_rows; 
    if($checker !== 0) { 
     if(!empty($output1)) { 
      $out = ""; 
      for($i = 1; $i <= $output1; $i++) { 
       if($i !== $output1) { 
        $out .= '$out' . $i . ","; 
       } else { 
        $out .= '$out' . $i; 
       } 
      } 
      $res = '$stmt->bind_result(' . $out . ');'; 
      eval("return $res"); 

      $vars = "array(" . $out . ");"; 

      while ($stmt->fetch()) { 
       $results[] = eval("return $vars"); 
      } 

     } 
    } else { 
     $results = "NO RESULTS"; 
    } 
    $stmt->fetch(); 
    $stmt->close(); 

    $this->results = array('num_rows' => $checker, $results); 

    return $this->results; 
}