mysql_insert_id()echos 0

时间:2013-11-18 14:17:41

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

我不是第一个遇到这个问题,但其他人的解决方案不起作用。 对于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),我将$linkmysql_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");
}

7 个答案:

答案 0 :(得分:3)

您的查询失败,因为您使用的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

持开放态度

答案 1 :(得分:3)

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

  

上一次成功查询为AUTO_INCREMENT列生成的ID,如果上一个查询未生成AUTO_INCREMENT,则 0;如果未建立MySQL连接则为FALSE。< / p>

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

通常的免责声明:mysql_函数已弃用,很快就会删除。停止使用它们并切换到MySQLi / PDO。功能

答案 2 :(得分:1)

这里的核心问题是,您使用mysqli进行query()来电,但之后尝试使用mysql_insert_id()功能。

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

如果您在代码的一部分中使用mysqli,则必须使用mysqli来代替所有其他与数据库相关的代码,否则它们将无法正常工作在一起。

所以你必须使用mysqli::$insert_id属性。

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

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

我希望有所帮助。


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

答案 3 :(得分:1)

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

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

$cfg['PersistentConnections'] = TRUE;

答案 4 :(得分:0)

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

来逃避它
INSERT INTO Produkte (Name,Price,`Desc`,User)

list of reserved words

答案 5 :(得分:0)

我猜错了多个错误:

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

Sql查询:sql-query end中的额外semi-colon和使用的保留关键字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

答案 6 :(得分:0)

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

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