2

我不是第一个遇到这个问题的人,但其他人的解决方案不起作用。此脚本始终为 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']->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");
}
4

7 回答 7

3

您的查询失败,因为您使用的是没有刻度的保留关键字。 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']."');";

请不要mysql_*在新代码中使用函数。它们不再被维护并被正式弃用。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 PDO,这里有一个很好的教程

您也对SQL 注入持开放态度

于 2013-11-18T14:19:32.630 回答
3

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

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

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

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

于 2013-11-18T14:19:47.460 回答
1

这里的核心问题是您正在使用mysqli您的query()通话,但随后尝试使用该mysql_insert_id()功能。

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

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

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

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

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

我希望这会有所帮助。


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

于 2013-11-18T15:08:09.313 回答
1

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

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

$cfg['PersistentConnections'] = TRUE;
于 2013-11-19T08:55:54.267 回答
0

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

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

保留字列表

于 2013-11-18T14:20:25.127 回答
0

我猜有多个错误:

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

Sql 查询:semi-colon在 sql-query end 和保留关键字 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

于 2013-11-18T14:22:17.570 回答
0

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

public function insert_id()
{
    $result = $this->MySQLiObj->insert_id;
    return $result;
}
于 2013-12-05T17:56:26.000 回答