2014-09-17 4 views
3

Прямо сейчас im использует Mysqli для извлечения данных из базы данных Mysql, использование кода im трудно понять и из моего понимания амортизируются функции или само по себе обесценивается. Если бы я мог получить некоторое представление и, возможно, некоторые обновленные методы моего Qoal извлечения данных из базы данных mysql.Получение многомерного массива из базы данных mysql

mysqli prepared statements

Что я до сих пор это:

$param = 1; 
$mysqli = new mysqli("127.0.0.1", "user", "password", "databaseName"); 
$mysqli->query('SELECT reply_id FROM replies WHERE reply_topic = ? ORDER BY reply_date ASC'); 
$mysqli->bind_param('i',$param) 
$mysqli->execute(); 
$row = bind_result_array($mysqli); 

while($mysqli->fetch()){ 
    $set[$row['']] = getCopy($row); 
} 
$mysqli->free_result(); 
return $set; 




function bind_result_array($stmt) 
{ 
    $meta = $stmt->result_metadata(); 
    $result = array(); 
    while ($field = $meta->fetch_field()) 
    { 
     $result[$field->name] = NULL; 
     $params[] = &$result[$field->name]; 
    } 

    call_user_func_array(array($stmt, 'bind_result'), $params); 
    return $result; 
} 

function getCopy($row) 
{ 
    return array_map(create_function('$a', 'return $a;'), $row); 
} 
+0

Начните с этой [ссылки] (http://www.w3schools.com/php/php_mysql_connect.asp), чтобы получить четкое представление о mysqli. Единственное различие между mysql и mysqli - лучшее использование $ connection. мы используем mysqli_query ($ connection, $ query) вместо mysql_query ($ query) и similary mysqli_fetch_array ($ connection, $ result). –

+0

Не доверяйте w3schools. Реальный вопрос в том, почему вы заселяете переменную '$ set' таким ухищренным способом? Что вы будете делать с этим позже? Чтение из db должно быть намного проще. – developerwjk

+0

@developerwjk $ set возвращает многомерный массив, один массив для каждой возвращаемой строки. Я видел это во многих учебниках и действительно понятия не имею, как еще получить то, что я хочу – DirtyRedz

ответ

2

Вы должны очистить вызов на базе первого. $mysqli->query отправил запрос перед привязкой параметров и так далее.

Заменить на следующее:

$stmt = $mysqli->prepare('SELECT reply_id FROM replies WHERE reply_topic = ? ORDER BY reply_date ASC'); 
$stmt->bind_param('i',$param) 
$stmt->execute(); 

$mysqli->prepare возвращает новый объект, который должен связать значения, а затем выполнить. Он избегает SQL injection!

Ничего из этого не амортизируется. mysqli_ - это именно то, что вы должны использовать.

Поскольку все, что вы хотите, представляет собой массив результатов, вы можете использовать следующий код для этого - никаких пользовательских функций не требуется.

$result = $stmt->get_result(); 
while ($row = $result->fetch_assoc()) { 
     $set[] = $row['reply_id']; 
} 

Для каждой строки в while, каждое поле сохраняется в массив с именем столбца в качестве ключа. Таким образом, $row['reply_id'] содержит значение столбца reply_id в базе данных. Выше я сохранил это значение в массиве с именем $set, и когда он перебирает следующую строку результатов, он сохраняет следующее значение и для этого массива.

Вы можете обработать результат до или после сохранения его в новый массив, как вы считаете нужным.

Надеюсь, это поможет.

+0

Мне сказали, что create_function обесценивается и не следует использовать. Но метод getrow() - это единственный подход, рассматриваемый в учебниках. – DirtyRedz

+0

А, я пропустил это. Вы можете просто использовать 'function ($ a) {return $ a; } ', поскольку это будет работать в PHP5.2 + – worldofjr

+0

Awsome thxs плохо ввергают это в мой код. Ценить это. – DirtyRedz

Смежные вопросы