编辑:在讨论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;
答案 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)
一个积极的事情,也就是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";
}
?>