2011-12-24 260 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; 
}