创建动态数量的变量

时间:2011-12-24 19:38:47

标签: php variables

编辑:在讨论here click here之后我决定使用Francis Avila解决方案,它更安全,但我找不到利用我的方式的方法,只有每个人都说它的安全风险使用eval()。如果您找到方法,利用我的方式,请发表评论。 :-),以便我理解它以及另一个使用eval的用户: - )

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

修改

一个积极的事情,也就是Francis Avila的解决方案是,你只需要特定的2个vars,$ SQL + $ INPUT,不需要更多兄弟的$ output。

编辑:删除旧问题并将其替换为此问题,这样您就可以更好地了解我想要做什么。

我找到了一个如何制作动态数量的变量的解决方案,但它不是最佳解决方案。因为如果变量的数量高于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;

3 个答案:

答案 0 :(得分: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中做同样事情的方法:

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

以下是使用PDO连接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);
}

答案 1 :(得分:1)

编辑:在讨论here click here后我决定使用Francis Avila解决方案,它更安全,但我没有找到一种方法来利用我的方式,只有每个人都说使用eval()的安全风险。如果你找到一种方法,利用我,请发表评论。 :-),以便我理解它以及另一个使用eval的用户: - )

一个积极的事情,也就是Francis Avila的解决方案是,你只需要特定的2个vars,$ SQL + $ INPUT,不需要更多兄弟的$ output。

我找到了一个解决方案: 概述:我使用了函数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;
}

答案 2 :(得分:0)

使用for循环

创建一个数组
<?php
    for($i = 1; $i <= [your value]; $i++)
    {
        $somearray[$i] = "your value";
    }
?>