繁体   English   中英

mysql_insert_id()echos 0

[英]mysql_insert_id() echos 0

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

您的查询失败,因为您使用的是保留关键字 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注入持开放态度

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

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

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

通常的免责声明:不推荐使用mysql_函数,很快就会将其删除。 停止使用它们并切换到MySQLi / PDO。

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

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

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

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

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

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

我希望有所帮助。


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

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

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

$cfg['PersistentConnections'] = TRUE;

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

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

保留字列表

我猜多重错误:

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

Sql查询:sql-query结尾的额外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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM