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)$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");
}
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_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に非推奨です赤いボックスが見えますか? 代わりにプリペアド ステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事は、どちらを決定するのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。

また、 SQL インジェクションに対して広くオープンです

于 2013-11-18T14:19:32.630 に答える
3

のドキュメントmysql_insert_id()はこれを非常によく説明しています:

前のクエリが成功した場合に AUTO_INCREMENT カラムに対して生成された ID。前のクエリが値を生成しない場合は 0、AUTO_INCREMENT MySQL 接続が確立されていない場合は FALSE。

テーブルに に設定された列がない可能性がありますAUTO_INCREMENT。そのような場合mysql_insert_id()に返されます。0

通常の免責事項:mysql_関数は非推奨であり、まもなく削除されます。それらの使用をやめて、代わりに MySQLi / PDO に切り替えてください。

于 2013-11-18T14:19:47.460 に答える
1

ここでの中心的な問題はmysqliquery()呼び出しに を使用しているのに、mysql_insert_id()関数を使用しようとしていることです。

mysqlimysql関数は 2 つの完全に別個のライブラリであり、互いに互換性がないことに注意してください。

mysqliコードの一部で使用している場合は、他のすべての DB 関連コードにも使用する必要があります。そうしないと、それらは連携して動作しません。mysqli

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 に答える
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-colonsql-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 に答える