Pergunta

Eu vi um par de perguntas ao longo dos últimos dias que têm mysqli utilizado, mas onde as respostas parecem não ter reconhecido a diferença entre $stmt->execute() e $db->query().

Pelo que entendi, há dois diferentes modelos para acessar os resultados em mysqli.

Este usa SQL cru e exige que o programador escapar a entrada para evitar ataques de injeção SQL, mas permite que o programador para recuperar uma matriz associativa (ou uma matriz simples) que contém mapeamentos column => value:

$result_set = $db->query("SAFE SQL QUERY HERE");
while ($row = $result_set->fetch_assoc()) {
     # do something with $row['fieldname'];
}  

Como alternativa, você pode fazer isso, o que permite boa ligação de parâmetros e resultados, mas não pode (AFAIK) dar-lhe qualquer tipo de resultado matriz simples:

$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS");
$stmt->bind_param("s", $input_variable);
$stmt->execute();
$stmt->bind_results($output_col1, $output_col2);
while ($stmt->fetch()) {
     # do something with $output_col1 and $output_col2
}

A minha pergunta é -? Existe alguma maneira com mysqli para obter a saída matriz simples mostrado no primeiro padrão, mas enquanto ainda usando parâmetros de entrada com segurança encadernados de acordo com o segundo padrão

Não consigo encontrar uma maneira de fazer isso (à excepção de usar PDO vez!).

Foi útil?

Solução

Existem várias implementações de uma função para fazer esse tipo de coisa nos comentários nesta página do manual PHP: mysqli_stmt :: buscar

Outras dicas

Alnitak,

AFAIK, você não pode associar uma matriz inteiro para os resultados buscados automaticamente. Infelizmente. No entanto, se você estiver olhando para o comportamento de matriz fora dele (provavelmente por isso é mais fácil de passar os resultados ao redor), você pode tentar o seguinte:

<?php
 $dbh = new mysqli( ... );
 $arr = array();
 if( $stmt = $dbh->prepare( 'SELECT id, email FROM email_list' );
 {
  $stmt->execute();
  $stmt->bind_result( $arr['id'], $arr['email'] );

  while( $stmt->fetch() )
   DoSomething( $arr );
 }
?>

Isto lhe dará o comportamento que você pediu, acima. Não vai, no entanto, os campos de matriz dinamicamente se ligam a indeces associativos na matriz -. Isto é, você deve especificar que id ser obrigado a $ arr [ 'id'], etc

Se ligar aos indeces associativas dinâmica é realmente exigido pelo seu cenário, você sempre pode escrever uma classe simples que primeiro analisar a consulta para os campos selecionados, em seguida, configurar as indeces matriz assoc, em seguida, executar a consulta.

Eu não digo. Pensei que eu não trabalhei com mysqli ou declarações preparadas uma tonelada, acredito que cada passo em seu segundo exemplo é discreto e necessário. O único consolo que lhe posso dar é que o primeiro exemplo encoberto alguns SQL escapar que você pode com segurança e verdadeiramente ignorar em seu segundo exemplo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top