【问题标题】:mysql_insert_id() echos 0mysql_insert_id() 回显 0
【发布时间】:2013-12-01 17:34:05
【问题描述】:

我不是第一个遇到此问题的人,但其他人的解决方案不起作用。 此脚本始终为 mysql_insert_id() 返回 0;我正在使用多个主键。

$sql = "INSERT INTO Produkte (Name,Price,Description,User)
VALUES ('".$_POST['name']."','".$_POST['price']."','".$_POST['description']."','".$_SESSION['user']."');";
$result = $GLOBALS['DB']->query($sql);
echo mysql_insert_id();
echo '<div class="saving">';
if($result){
echo "Saved!";
} else{
echo("Saving failed");
} echo '</div>';
} 

我已经尝试过mysql_insert_id($link),我将$link 链接到mysql_connect()mysql_insert_id($GLOBALS['DB']-&gt;MySQLiObj)

我的 $GLOBAL['DB']

if(!isset($GLOBALS['DB']))$DB = new \System\Database\MySQL(MYSQL_HOST,MYSQL_BENUTZER,MYSQL_KENNWORT,MYSQL_DATENBANK,MYSQL_PORT);

我的 MySQL 课程:

public $MySQLiObj = null;

function __construct($server, $user, $password, $db, $port = '3306')
{

    $this->MySQLiObj = new \mysqli($server, $user, $password, $db, $port);

    if (mysqli_connect_errno())
    {
        echo "Keine Verbindung zum MySQL-Server möglich.";
        trigger_error("MySQL-Connection-Error", E_USER_ERROR);
        die();
    }

    $this->query("SET NAMES utf8");
}

【问题讨论】:

  • 你使用的是什么数据库抽象层($GLOBALS['DB'])?
  • @JohnConde 它什么也没说mysql_error(); (error_reporting(E_ALL);)
  • mysql_insert_id() 自 PHP 5.5.0 起已弃用,请改用 mysqli 功能
  • @user2972107 你的意思是我应该使用mysqli::$insert_id
  • 是的...让您的代码在标准和性能方面保持最新并没有什么坏处! :)

标签: php mysql sql insert mysql-insert-id


【解决方案1】:

mysql_insert_id() 的文档很好地解释了这一点:

上一个查询成功时为 AUTO_INCREMENT 列生成的 ID,如果上一个查询没有生成 AUTO_INCREMENT,如果没有建立 MySQL 连接,则为 FALSE。

您的表可能没有任何列设置为AUTO_INCREMENT。在这种情况下,mysql_insert_id() 将返回 0

通常的免责声明:mysql_ 函数已弃用,很快将被删除。停止使用它们并改用 MySQLi / PDO。

【讨论】:

  • @JSHelp:在mysql_insert_id() 语句之后添加echo mysql_error();。它输出什么?
  • @JSHelp:当您尝试手动执行 MySQL 查询时会发生什么? (使用 phpMyAdmin 或类似工具)
【解决方案2】:

您的查询失败,因为您使用的 reserved keyword desc 没有刻度。结果 INSERT 失败,因此没有返回 ID。

$sql = "INSERT INTO Produkte (Name,Price,Desc,User)
VALUES ('".$_POST['name']."','".$_POST['price']."','".$_POST['description']."','".$_SESSION['user']."');";

应该是

$sql = "INSERT INTO Produkte (Name,Price,`Desc`,User)
VALUES ('".$_POST['name']."','".$_POST['price']."','".$_POST['description']."','".$_SESSION['user']."');";

Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?了解prepared statements,并使用PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial

你也对SQL injections敞开心扉

【讨论】:

    【解决方案3】:

    这里的核心问题是您使用mysqli 进行query() 调用,然后尝试使用mysql_insert_id() 函数。

    请注意,mysqlimysql 函数是两个完全独立的库,彼此不兼容。

    如果您在代码的一部分中使用mysqli,则必须对所有其他与数据库相关的代码也使用mysqli,否则它们将无法协同工作。 p>

    因此您必须改用mysqli::$insert_id 属性。

    您在问题中提到您可以以$GLOBALS['DB']-&gt;connection 访问您的连接对象。在这种情况下,您应该能够编写如下代码:

    $newId = $GLOBALS['DB']->connection->insert_id;
    

    希望对你有帮助。


    PS:当我在这里时,我会补充一点,您应该避免像这样将$_POST 变量直接放入您的查询字符串中。这是非常糟糕的做法,并且具有一些危险的安全隐患。您应该考虑使用 mysqli-&gt;prepare()mysqli-&gt;bind_param() 来为您的查询添加参数。

    【讨论】:

    • 感谢 POST 的建议,我会(而且我会)稍后在 sql 连接和所有工作之后更改它。
    • 另请注意,我无法访问$GLOBALS['DB']-&gt;connection,我实际上是指$GLOBALS['DB']-&gt;MySQLiObj(请参阅我的问题)。我也试过mysqli_insert_id()$GLOBALS['DB']-&gt;MySQLiObj-&gt;insert_id(见cmets)它们都不起作用。
    • 您说“它们都不起作用”,但请详细说明:您从中得到了什么错误?
    • 为了清楚起见,我的答案的第一部分仍然是正确的:即使mysqli-&gt;insert_id 不能完全按照我在答案中或根据您的测试中所说的那样工作,这 is 寻找答案所需的方向。你不能使用旧的mysql_insert_id(),如果你使用mysqli进行插入,你期望从中得到一个值。
    【解决方案4】:

    如果您使用的是 phpMyAdmin,可能 PersistentConnections 在配置文件中被禁用 (config.inc.php)。

    如果是这种情况,请将其更改为:

    $cfg['PersistentConnections'] = TRUE;
    

    【讨论】:

      【解决方案5】:

      desc是mysql中的保留字,所以需要用``

      转义
      INSERT INTO Produkte (Name,Price,`Desc`,User)
      

      list of reserved words

      【讨论】:

      • 我改了,没修
      【解决方案6】:

      我猜是多个错误:

      mysqli_insert_id($con) //$con is connection obj
      

      Sql 查询:额外的semi-colon 在 sql-query 结束和保留关键字 DESC 使用

       "INSERT INTO Produkte (Name,Price,`Desc`,User)
      VALUES ('".$_POST['name']."','".$_POST['price']."','".$_POST['description']."','".$_SESSION['user']."')";
      

      参考手册: http://us3.php.net/manual/en/mysqli.insert-id.php

      【讨论】:

        【解决方案7】:

        好吧,我终于成功了! 在我的类中,我添加了函数 insert_id(),然后在本地添加了 insert_id 变量。

        public function insert_id()
        {
            $result = $this->MySQLiObj->insert_id;
            return $result;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-01-04
          • 1970-01-01
          • 1970-01-01
          • 2013-04-13
          • 1970-01-01
          • 2016-12-13
          • 2013-03-21
          • 1970-01-01
          相关资源
          最近更新 更多