Создать динамическое число переменных - PullRequest
0 голосов
/ 24 декабря 2011

РЕДАКТИРОВАТЬ: после обсуждения здесь нажмите здесь Я решил использовать решение Фрэнсиса Авила, это безопаснее, но я не нашел способа использовать свой путь, только все говорятсвой риск безопасности использовать eval ().Если вы найдете способ, чтобы использовать мой способ, пожалуйста, оставьте комментарий.:-), чтобы я понял это, а также другие пользователи, которые используют eval: -)

Еще одна вещь, не использующая eval (), это медленнее, чем я хотел.

РЕДАКТИРОВАТЬ:

Еще один положительный момент, который также есть в решении Фрэнсиса Авилы: вам нужны только конкретные 2 переменные, $ 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 ]

2 голосов
/ 25 декабря 2011

Если вы не слишком глубоко, я очень рекомендую использовать 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;
}

Вот как подключиться к MySQL с помощью PDO:

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 голос
/ 25 декабря 2011

РЕДАКТИРОВАТЬ: после обсуждения здесь нажмите здесь я решил использовать решение Фрэнсиса Авилы, оно безопаснее, но я не нашел способа использовать свой путь, только все говорят, что его риск для безопасности заключается в использовании eval().Если вы найдете способ, чтобы использовать мой выезд, пожалуйста, оставьте комментарий.:-), чтобы я понял это, а также другие пользователи, которые используют eval: -)

Еще один положительный момент, который также есть в решении Фрэнсиса Авилы, вам нужны только конкретные 2 переменные, $ SQL + $ВХОД, больше не нужно, брат с $ 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;
}
0 голосов
/ 24 декабря 2011

Создать массив с циклом for

<?php
    for($i = 1; $i <= [your value]; $i++)
    {
        $somearray[$i] = "your value";
    }
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...