O documento descreve como usar instruções preparadas no MySQL para otimizar consultas repetitivas, reduzindo o processamento. Existem dois tipos: associação de parâmetros, onde consultas são armazenadas com dados variáveis enviados repetidamente, e associação de resultados, onde variáveis são associadas aos campos retornados. As instruções são preparadas com stmt_init() e execute(), e parâmetros ou resultados são associados com bind_param() e bind_result().
Aula 09 - Instruções preparadas e otimização de consultas do Mysql - Programação Web
1.
2.
3. Fazer isso da forma convencional, ou seja, utilizando os comandos de consulta dentro de loops pode gerar sobrecarga de acesso ao BD;
4. Na versão 4.1, o MySQL implementou a possibilidade de utilizarmos “ instruções preparadas ” que realizam essas tarefas a um custo menor de processamento.
5.
6. Associação de resultados: permitir o uso de arrays para puxar valores dos resultados de consultas associando variáveis PHP aos campos.
7. Preparando a instrução <?php // cria uma nova conexão com o BD $mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate'); // cria uma consulta e as campos de armazenamento dos dados $query = "SELECT sku, name, price, description FROM products ORDER BY sku"; // cria um objeto de instrução $stmt = $mysqli->stmt_init(); // prepara a instrução para execução $stmt->prepare($query); .. faz alguma coisa com a instrução preparada // recupera os recursos alocados para a instrução $stmt->close(); // fecha a conexão. $mysqli->close(); ?>
8.
9. Associação de resultados: a instrução será executada antes de associar os resultados as variáveis com o método bind_result();
10. Em ambos os casos, a instrução preparada é executada com o método execute().
11. Associando parâmetros <?php // cria uma nova conexão com o banco $mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate'); // cria uma consulta e o os campos a serem parametrizados $query = "INSERT INTO products SET id=NULL, sku=?, name=?, price=?"; // cria um objeto de instrução $stmt = $mysqli->stmt_init(); // prepara a instrução para execução $stmt->prepare($query); // associa os parâmetros e define os tipos // s-> string, s-> string, d-> decimal $stmt->bind_param('ssd', $sku, $name, $price); // Atribui um array coletado via formulário $skuarray = $_POST['sku']; // Atribui um array coletado via formulário $namearray = $_POST['name']; // Atribui um array coletado via formulário $pricearray = $_POST['price']; // Inicializa o contador $x = 0; // loop que percorre todo o array e executa a instrução while ($x < sizeof($skuarray)) { $sku = $skuarray[$x]; $name = $namearray[$x]; $price = $pricearray[$x]; $stmt->execute(); } // Libera os recursos da instrução $stmt->close(); // Fecha a conexão $mysqli->close(); ?>
12. Associando variáveis <?php // cria uma conexão com o servidor $mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate'); // cria uma consulta $query = 'SELECT sku, name, price FROM products ORDER BY sku'; // cria um objeto de instrução $stmt = $mysqli->stmt_init(); // prepara a instrução para execução $stmt->prepare($query); // executa a instrução $stmt->execute(); //associa os resultados as variáveis $stmt->bind_result($sku, $name, $price); // faz um loop pelos resultados exibindo na tela while($stmt->fetch()) // o método fetch() recupera cada linha retornada como resultado de uma instrução printf("%s, %s, %s <br />", $sku, $name, $price); // libera os recursos alocados $stmt->close(); // fecha a conexão $mysqli->close(); ?>
13.
14. num_rows(): retorna o número de linhas recuperadas pela última instrução especificada pelo objeto stmt;