1

最後に挿入された自動インクリメント行の ID を取得しようとしていますが、取得できません。

error_reporting(E_ALL);
ini_set('display_errors', 1);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$title = mysqli_real_escape_string($conxn,$_POST['blog_title']);
$entry = mysqli_real_escape_string($conxn,$_POST['blog_entry']);
$sourceName = mysqli_real_escape_string($conxn,$_POST['blog_source_name']);
$sourceLink = mysqli_real_escape_string($conxn,$_POST['blog_source_link']);

if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql="INSERT INTO blog (blog_title, blog_entry, blog_source, blog_link)
VALUES ('$title','$entry','$sourceName','$sourceLink')";

$lastID = $mysqli->insert_id;

if (!mysqli_query($conxn,$sql)) {
die('Error: ' . mysqli_error($conxn));
}

エコー$lastIDすると、送信するたびに「0」が返されます。

4

1 に答える 1

1

$mysqli->insert_id()実際の の後に を配置する必要がありますmysqli_query()。下記参照。

if (!mysqli_query($conxn,$sql)) {
  die('Error: ' . mysqli_error($conxn));
}

$lastID = $mysqli->insert_id;

とはいえ、コードには他にも問題があります。まず第一に、呼び出しのオブジェクト指向スタイルとmysqli_*手続き型スタイルを混同しています。たとえば、 の OOP メソッドは$mysqli->real_escape_string、 の手続き型メソッドと同等ですmysqli_real_escape_string

したがって、この:

$lastID = $mysqli->insert_id;

これでなければなりません:

$lastID = mysqli_insert_id($conxn);

したがって、コードの残りの部分を見ないと、処理方法がわかりません。違いを知り、実験してください。しかし、あなたが提示したコードに基づいて、誠意を持って私の提案を以下に示します。

たとえば、$_POST値への参照には一重引用符がないため、それを追加しました。また、文字列置換を処理する二重引用符を使用しているため、連結INSERTを取り除くことで変数設定を要約できます。.

$title = mysqli_real_escape_string($conxn, $_POST['blog_title']);
$entry = mysqli_real_escape_string($conxn, $_POST['blog_entry']);
$sourceName = mysqli_real_escape_string($conxn, $_POST['blog_source_name']);
$sourceLink = mysqli_real_escape_string($conxn, $_POST['blog_source_link']);

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql="INSERT INTO blog (blog_title, blog_entry, blog_source, blog_link)
VALUES ('$title','$entry','$sourceName','$sourceLink')";

if (!mysqli_query($conxn,$sql)) {
  die('Error: ' . mysqli_error($conxn));
}

$lastID = mysqli_insert_id($conxn);

これで、このコード チャンクレットをさらにクリーンアップすることができます。これが私の処理方法です。$_POSTコードを繰り返す必要がないように、取得する値の配列を作成しました。また、何が起こっているのかを明確にするためにコメントを追加しました。ここでは、すべてのコマンドに手続き型の形式を使用しています。OOP が必要な場合は、すべてのコマンドを OOP 形式に合わせて変更する必要があります。

// Set all of the `$_POST` values into an array.
$post_items = array('blog_title','blog_entry','blog_source_name', 'blog_source_link');

// Roll through those values with a `foreach` loop.
foreach ($post_items as $post_item) {
  $$post_item = mysqli_real_escape_string($conxn, $_POST[$post_item]);
}

// MySQL connection error check.
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// Set the SQL values.
$sql = "INSERT INTO blog (blog_title, blog_entry, blog_source, blog_link)
VALUES ('$blog_title','$blog_entry','$blog_source_name','$blog_source_link')";

// Run the query.
if (!$mysqli_query($conxn, $sql)) {
  die('Error: ' . mysqli_error($conxn));
}

// Get the last insert ID via object oriented method.
// $lastID = $mysqli->insert_id;

// Get the last insert ID via procedural method.
$lastID = mysqli_insert_id($conxn);
于 2014-05-03T02:14:22.380 に答える