Php 使用stmt和mysqli插入数据库

Php 使用stmt和mysqli插入数据库,php,insert,mysqli,Php,Insert,Mysqli,大家好,我是第一次使用stmt(在以前通过扩展类使用标准mysqli函数之后,看看如何转换代码) 然而,我似乎无法让它工作。我正在使用PHP5.2.11和mysql 4.1.22 我有一个这样的表格结构: CREATE TABLE IF NOT EXISTS`tags`( `tag_id`smallint(3)无符号非空自动增量, `标题“varchar(32)非空默认值”, 主键(`tag_id`) )ENGINE=MyISAM默认字符集=utf8自动增量=9; 这是我的代码,我一直使用和p

大家好,我是第一次使用stmt(在以前通过扩展类使用标准mysqli函数之后,看看如何转换代码)

然而,我似乎无法让它工作。我正在使用PHP5.2.11和mysql 4.1.22

我有一个这样的表格结构:

CREATE TABLE IF NOT EXISTS`tags`(
`tag_id`smallint(3)无符号非空自动增量,
`标题“varchar(32)非空默认值”,
主键(`tag_id`)
)ENGINE=MyISAM默认字符集=utf8自动增量=9;
这是我的代码,我一直使用和php.net作为参考

$mysqli=新的mysqli('***','***','***','***','***');
if(mysqli\u connect\u errno()){
printf(“连接失败:%s\n”,mysqli_Connect_error());
退出();
}
$stmt=$mysqli->prepare(“插入标签(标题)值(?)”;
$stmt->bind_参数($s',$title);
$title='test123';
$stmt->execute();
$stmt->close();
$mysqli->close();
这看起来很简单,我希望它能在title列中插入“test123”,标记id自动递增,但title是空的(标记id会自动递增)

有人知道我哪里出错了吗

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

正如atli指出和测试的那样,它在MYSQL版本5及以上版本上工作。因此,使用旧版本的sql可能存在问题,尽管php.net文档说mysqli“允许您访问MYSQL 4.1及以上版本提供的功能”

如果有人能提出另一个原因来解释它为什么不起作用,或者如何让它在我的环境中起作用,那就太好了。如果没有,我想我会继续使用我自己的mysqli类扩展来准备和清理查询。

而不是

$stmt->bind_param('s', $title);
试试这个:

$stmt->bindParam(1, $title, PDO::PARAM_STR);

我已经在我的测试服务器上测试了您的代码,它运行良好。(使用PHP5.3和MySQL 5.1.37)
因此,这不是代码本身,也不是数据库设计

我的第一个猜测是与您的MySQL版本不兼容。
您可以尝试使用该函数查看是否发出任何警告


如果可能的话,我建议升级MySQL。您使用的版本已经非常过时了。-我本来打算安装4.1并在上面进行测试(只是为了好玩:p),但他们甚至没有可用的下载。在使用之前定义$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();

他使用的是mysqli,而不是PDO。在使用mysqli类时,不能只是抛出一个PDO方法。正如Atli所说,PDO对引用有帮助,它返回:“致命错误:无法通过引用传递参数3”在我当前的环境中无法升级。但我会看看是否可以找到另一台服务器来运行测试。get_警告不会返回任何信息。在5.0.83上进行了测试,效果很好。这让我很恼火。在php.net上对mysqli的介绍说,它“允许您访问MySQL 4.1及以上版本提供的功能”.所以我认为它应该会起作用,显然不是。