2010-01-27 49 views
0

您好我玩用语句的第一次(在看以前通过扩展类使用标准库MySQLi功能后,在转换我的代码。插入到数据库语句和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(); 

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

任何人有任何想法,我错了吗?

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

正如atli指出并测试的,它适用于MYSQL版本为5及以上的版本。所以这可能是使用旧版本的sql的一个问题,尽管php.net文档说mysqli“允许你访问MySQL 4.1及更高版本提供的功能”。

如果任何人都可以建议另一个原因,为什么它可能不工作,或如何让它在我的环境中工作,将是伟大的。如果不是,我想我会继续使用自己的mysqli类的扩展来准备和清理查询。

回答

1

我测试过我的测试服务器上的代码,它工作正常。 (使用PHP 5.3和MySQL 5.1.37)
所以它不是代码本身或数据库设计。

我的第一个猜测会和你的MySQL版本有些不兼容。
您可以尝试使用mysqli_stmt::get_warnings函数来查看是否发出任何警告。

如果完全有可能,我会建议升级MySQL。你使用的版本越来越古老。 - 我打算安装4.1并对其进行测试(仅用于娱乐:P)但他们甚至没有可用的下载。

+0

升级在我当前的环境中是不可能的。但是我会看看是否可以找到另一台可以运行测试的服务器。 get_warnings不会返回任何内容。 – Rob 2010-01-27 11:48:35

+1

在5.0.83上进行了测试,效果很好。这对我来说很烦人。在php.net上对mysqli的介绍说它“允许你访问由MySQL 4.1和更高版本提供的功能”。所以我会认为它应该起作用,显然不是。 – Rob 2010-01-27 11:55:18

-1

而不是

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

试试这个:

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

他用mysqli的,没有PDO。使用mysqli类时,不能仅仅抛出PDO方法。 – Atli 2010-01-27 11:17:49

+0

正如Atli所说,PDO确实有助于参考:“致命错误:无法通过参考传递参数3” – Rob 2010-01-27 11:30:25

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();