嗨,我第一次玩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自动递增的情况下将“test 123”插入title列。但是标题是空白的(tag_id确实如人们所假设的那样递增)。
任何人都有任何想法我错了吗?
=============================================== ==
正如atli指出并测试的那样,它适用于5及以上的MYSQL版本。因此,使用旧版本的sql可能存在问题,尽管php.net文档说mysqli“允许您访问MySQL 4.1及更高版本提供的功能”。
如果有人可以提出另一个原因,为什么它可能无法正常工作或如何让它在我的环境中工作,这将是很好的。如果不是,我想我将继续使用我自己的mysqli类扩展来准备和清理查询。
答案 0 :(得分:1)
我在我的测试服务器上测试了你的代码,它运行正常。 (使用PHP 5.3和MySQL 5.1.37)
所以它不是代码本身,也不是数据库设计。
我的第一个猜测是与你的MySQL版本有些不兼容 您可以尝试使用mysqli_stmt::get_warnings函数查看是否发出了任何警告。
如果可能的话,我建议升级MySQL。你正在使用的版本变得非常古老。 - 我打算安装4.1并在其上测试(只是为了好玩:P)但他们甚至都没有可用的下载。
答案 1 :(得分:0)
在使用之前定义$ title。你应该包括这一行
$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();
答案 2 :(得分:-1)
而不是
$stmt->bind_param('s', $title);
试试这个:
$stmt->bindParam(1, $title, PDO::PARAM_STR);