用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: %sn", 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();

这似乎很简单,我希望它会插入“测试123”标题列与tag_id自动递增。 但是,标题是空白的(tag_id的确如人们所想的那样增加了)。

任何人有任何想法,我会出错?

=================================================

正如atli指出并测试的,它适用于MYSQL版本为5及以上的版本。 所以这可能是使用旧版本的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。 你应该包含这一行

$title = 'test 123';

之前

$stmt->bind_param('s', $title);

完整代码:

$mysqli = new mysqli('***','***','***','***');

if (mysqli_connect_errno()) {
    printf("Connect failed: %sn", 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);
链接地址: http://www.djcxy.com/p/93691.html

上一篇: Inserting into database with stmt and mysqli

下一篇: Effectiveness of stripslashes against SQL Injection?