Inserindo no banco de dados com STMT e MySQLI
Pergunta
Olá, estou tocando com o STMT pela primeira vez (olhando para converter meu código depois de usar anteriormente o MySQLI funções por meio de uma classe de extensão.
No entanto, não consigo fazer funcionar. Estou usando o PHP 5.2.11 e o MySQL 4.1.22.
Eu tenho uma estrutura de tabela como sim:
CREATE TABLE IF NOT EXISTS `tags` ( `tag_id` smallint(3) unsigned NOT NULL auto_increment, `title` varchar(32) NOT NULL default '', PRIMARY KEY (`tag_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
E aqui está o meu código, eu tenho usado http://devzone.zend.com/article/686 e php.net como referências.
$mysqli = new mysqli('***','***','***','***'); if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $stmt = $mysqli->prepare("INSERT INTO tags (title) VALUES (?)"); $stmt->bind_param('s', $title); $title = 'test 123'; $stmt->execute(); $stmt->close(); $mysqli->close();
Parece simples o suficiente e eu espero que insira "teste 123" na coluna de título com o incremento automático tag_id. Mas, em vez disso, o título está em branco (tag_id aumenta como se poderia assumir).
Alguém tem alguma idéia em que estou dando errado?
=================================================
Como a Atli apontou e testou, ele funciona na versão MySQL de 5 ou mais. Portanto, é provavelmente um problema em usar uma versão antiga do SQL, embora a documentação do Php.NET diga que o MySQLI "permite acessar a funcionalidade fornecida pelo MySQL 4.1 e acima".
Se alguém puder sugerir outra razão pela qual pode não estar funcionando ou como fazê -lo funcionar no meu ambiente, isso seria ótimo. Caso contrário, suponho que vou acompanhar minha própria extensão da aula do MySQLI para preparar e limpar consultas.
Solução
Eu testei seu código no meu servidor de teste e funciona bem. (Usando o PHP 5.3 e o MySQL 5.1.37)
Portanto, não é o código em si ou o design do banco de dados.
Meu primeiro palpite seria alguma incompatibilidade com sua versão MySQL.
Você pode tentar usar o mysqli_stmt :: get_warnings função para ver se há algum aviso emitido.
Se for possível, eu recomendaria atualizar o MySQL. A versão que você está usando está ficando bastante antiga. - Eu ia instalar 4.1 e testá -lo (Só por diversão: P) Mas eles nem têm mais os downloads disponíveis.
Outras dicas
Defina o título $ antes de usá -lo. Você deve incluir esta linha
$title = 'test 123';
antes da
$stmt->bind_param('s', $title);
Código completo:
$mysqli = new mysqli('***','***','***','***');
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$title = 'test 123';
$stmt = $mysqli->prepare("INSERT INTO tags (title) VALUES (?)");
$stmt->bind_param('s', $title);
$stmt->execute();
$stmt->close();
$mysqli->close();
Ao invés de
$stmt->bind_param('s', $title);
Experimente isso:
$stmt->bindParam(1, $title, PDO::PARAM_STR);