题
嗨,我是第一次使用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);