STMTおよびMySQLIを使用してデータベースに挿入します
質問
こんにちは、私は初めてSTMTで遊んでいます(以前に標準のmysqli関数を拡張クラスで使用した後にコードを変換することを見ています。
しかし、私はそれを機能させることができないようです。 PHP 5.2.11とMySQL 4.1.22を使用しています。
私はそうするようなテーブル構造を持っています:
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 ;
そして、これが私のコードです、私は使用しています http://devzone.zend.com/article/686 および参照としてのphp.net。
$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();
簡単に思えますが、TAG_IDオートインクリメントで「テスト123」をタイトル列に挿入することを願っています。しかし、代わりにタイトルは空白です(tag_idは、想定するように増分を行います)。
誰かが私が間違っているところで何かアイデアを持っていますか?
=================================================
Atliが指摘してテストしたように、5以降のMySQLバージョンで動作します。したがって、SQLの古いバージョンを使用することはおそらく問題ですが、PHP.NETドキュメントではMySQLIで「MySQL 4.1以降が提供する機能にアクセスできる」と述べています。
誰かがそれが機能していないかもしれない別の理由を提案できるなら、それが私の環境でそれを機能させる方法を私の環境で機能させる方法。そうでない場合は、MySQLIクラスの独自の拡張機能を維持して、クエリを準備してクリーニングします。
解決
テストサーバーでコードをテストしましたが、正常に動作します。 (PHP 5.3およびMySQL 5.1.37を使用)
そのため、コード自体やデータベース設計ではありません。
私の最初の推測は、MySQLバージョンとの互換性です。
を使用してみてください mysqli_stmt :: get_warnings 発行された警告があるかどうかを確認する機能。
可能であれば、MySQLをアップグレードすることをお勧めします。使用しているバージョンはかなり古くなっています。 - 私は4.1をインストールし、それでこれをテストするつもりでした (ただ楽しみのため:P) しかし、彼らはもうダウンロードを利用できることすらありません。
他のヒント
使用する前に$タイトルを定義します。この行を含める必要があります
$title = 'test 123';
前
$stmt->bind_param('s', $title);
完全なコード:
$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();
それ以外の
$stmt->bind_param('s', $title);
これを試して:
$stmt->bindParam(1, $title, PDO::PARAM_STR);