2013-07-11 2 views
0

У меня возникают проблемы с возможностью одновременного открытия одного набора результатов из mysqli. В частности, я пытаюсь выполнить цикл запроса и обновить столбцы внутри этого запроса после выполнения действия.mysqli Результаты запроса select, используемого в запросе обновления

$db = new mysqli($DBServer, $DBUser, $DBPass , $DBName); 
$sql = 'SELECT UPRN, POSTCODE FROM T_TEMP'; 
$stmt = $db->prepare($sql); 
$stmt -> Execute(); 

<Create an array from the above select statement as i understand that mysqli can 
only hold one result set at once (seems odd). I am unsure how to do this such that 
i can then reference UPRN and POSTCODE later> 

$stmt->Close(); 

$sql = 'update T_TEMP set LAT = ?, LONG = ? where UPRN = ?'; 
$stmt = $db ->prepare($sql); 

<loop through that array built above grabbing UPRN and POSTCODE as you go through> 

$postcode = urlencode(<Reference the postcode in the array>); 
$request_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=".$postcode."&sensor=false"; 
$xml = simplexml_load_file($request_url); 

$lat = round(floatval($xml->result->geometry->location->lat),4); 
$long = round(floatval($xml->result->geometry->location->lng),4); 

$stmt -> bind_param('ddi',$lat,$long,$UPRN); 

$stmt -> Execute(); 

<end loop> 

Я борюсь с получением результатов первого запроса в массив, а затем ссылается этот массив в цикле, так что я могу установить значение. Любая помощь очень ценится!

+0

показать нам свой массив ... это будет долгий путь, чтобы помочь. – IROEGBU

+0

У меня нет массива, я знаю, что мне нужно его построить, но я не уверен, как это сделать. Я отредактирую код, чтобы сделать его более очевидным, чем я застрял. – Culture

ответ

1

Не используйте mysqli. Вместо этого используйте PDO. В этом последнем случае этот желаемый код будет одной единственной линии:

include 'db.php'; 
$sql = 'SELECT UPRN, POSTCODE FROM T_TEMP'; 
$stmt = $db->prepare($sql); 
$stmt->execute(); 
$array = $stmt->fetchAll(); // here you are 
+0

Хотя этот вопрос не имеет отношения к моему ответу, я тоже мог бы ответить на этот вопрос. Использование prepare() должно быть привычкой. Вернее, рефлекс. подготовить позволяет использовать подготовленные инструкции, которые всегда необходимо использовать. –

+0

А теперь у меня есть: '$ AddressArray = array(); $ AddressArray = $ stmt-> fetchAll(); foreach ($ ArrayAddressSingle as $ AddressArray) { } ' Как адресовать эти столбцы в цикле? – Culture

-1

После того, как управляемый в правильном направлении Я закончил чтение результирующего набора в массив, а затем цикл через этот массив. (Этот комментарий был проголосован, но я его редактирую, чтобы его легче было найти другому).

Вы не можете открывать два запроса mysqli, поскольку сервер будет только держать вас в памяти (фактически на сервере). Итак, вы читаете первый запрос в php-массив, а затем выполняете инструкции mysqli внутри этого массива.

$vInteger =1; //This is just an example variable 

$sql ='select column from table where column = ?'; //select with a passed value 

$stmt = db->prepare($sql); 

$stmt-> bind_param('i', $vInteger); //again, this could be a string, double or integer 

$stmt->execute(); 

$result = $stmt->get_result(); //retrieves the results from the server into a class 

while ($row = $result->fetch_assoc(){ 
    $Array[] = $row; //reads the rows into a new array 
} 

$stmt -> free_result(); //Drop the mysqli bit cause you are going to need it again! :) 

foreach($Array as $item){ 
    $item['Column']; // this is the column name from your original query 


// Of course in here you might want to do another mysqli query with the prepare etc etc and reference the $item. 

} 

Если вы решили использовать MySQLi, который работал для меня, и я думаю, что get_result создает Mysqli класс результата, к которому можно применить метод FETCH_ASSOC ..

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

  • Нет связанных вопросов^_^