【问题标题】:Inserting into database with stmt and mysqli使用 stmt 和 mysqli 插入数据库
【发布时间】:2011-01-09 21:51:00
【问题描述】:

您好,我是第一次使用 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();

它看起来很简单,我希望它将“test 123”插入到标题列中,并且 tag_id 自动递增。但是标题是空白的(tag_id 确实会增加)。

有人知道我哪里出错了吗?

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

正如 atli 指出和测试的那样,它适用于 MYSQL 5 及更高版本。因此,尽管 php.net 文档说 mysqli“允许您访问 MySQL 4.1 及更高版本提供的功能”,但使用旧版本的 sql 可能是一个问题。

如果有人能提出另一个可能无法正常工作的原因,或者如何让它在我的环境中工作,那就太好了。如果不是,我想我会继续使用我自己的 mysqli 类扩展来准备和清理查询。

【问题讨论】:

    标签: php insert mysqli


    【解决方案1】:

    代替

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

    试试这个:

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

    【讨论】:

    • 他使用的是 mysqli,而不是 PDO。使用 mysqli 类时不能只抛出 PDO 方法。
    • 正如 Atli 所说,PDO 确实有助于引用它返回:“致命错误:无法通过引用传递参数 3”
    【解决方案2】:

    我已经在我的测试服务器上测试了您的代码,它运行良好。 (使用 PHP 5.3 和 MySQL 5.1.37)
    所以不是代码本身,也不是数据库设计。

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

    如果可能的话,我建议升级 MySQL。您使用的版本变得非常古老。 - 我打算安装 4.1 并在上面测试它(只是为了好玩:P),但他们甚至没有可用的下载了。

    【讨论】:

    • 在我当前的环境中无法升级。但我会看看我是否能找到另一台可以运行测试的服务器。 get_warnings 不返回任何内容。
    • 在 5.0.83 上测试过,效果很好。这对我来说很烦人。 php.net 上对 mysqli 的介绍说它“允许您访问 MySQL 4.1 及更高版本提供的功能”。所以我会认为它应该有效,显然不是。
    【解决方案3】:

    在使用之前定义 $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();
    

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 2016-05-15
      • 1970-01-01
      • 2011-04-12
      • 2015-02-27
      • 1970-01-01
      • 2013-08-24
      • 2022-06-23
      • 1970-01-01
      相关资源
      最近更新 更多