আমি পিএইচপি-তে কোনও মাইএসকিউএল টেবিলের সর্বশেষ inোকানো আইডি কীভাবে পাব?


93

আমার একটি টেবিল রয়েছে যাতে প্রায়শই নতুন ডেটা .োকানো হয়। আমার সারণির খুব শেষ আইডি পাওয়া দরকার। কিভাবে আমি এটি করতে পারব?

এর সাথে কি মিল আছে SELECT MAX(id) FROM table?


4
হ্যাঁ, আপনি এই প্রশ্নের সারণির শেষ আইডি ফিরিয়ে দেবেন। তবে একটি শর্ত হ'ল আইডি অবশ্যই প্রাথমিক কী হবে। সুতরাং আপনি অনুতাপ এড়াতে পারেন।
সতীশ

7
@ সতীশ: এই পদ্ধতির প্রধান সমস্যা হ'ল সম্মতি
ক্রিশ্চান সি সালভাদে

4
বিস্তারিত বলার জন্য: এটির সাথে সমস্যাটি হ'ল যদি অন্য কেউ আপনার INSERTএবং কোয়েরির মধ্যে টেবিলের মধ্যে কিছু সন্নিবেশ করায় তবে MAX(id)আপনি একটি আইডি পেতে পারেন যা আপনার শেষ আইডি নয়।
ছদ্মবেশ

4
@ জসুলিনকে এই প্রশ্নটির তুলনায় কয়েক হাজার মতামত নিয়ে এক বছর পরে জিজ্ঞাসা করা হয়েছিল ।
নফতালি ওরফে নীল

4
@ নিল, আপনি ঠিক বলেছেন অন্য প্রশ্নটির এটির সদৃশ হিসাবে বন্ধ করা উচিত।
জোসলিন

উত্তর:


134

আপনি যদি পিডিও ব্যবহার করেন তবে ব্যবহার করুন PDO::lastInsertId

আপনি যদি মাইস্ক্লি ব্যবহার করছেন তবে ব্যবহার করুন mysqli::$insert_id

আপনি যদি এখনও মাইএসকিএল ব্যবহার করেন:

দয়া করে mysql_*নতুন কোডে ফাংশন ব্যবহার করবেন না । এগুলি আর রক্ষণাবেক্ষণ করা হয় না এবং সরকারীভাবে হ্রাস করা হয় । দেখুন লাল বক্স ? পরিবর্তে প্রস্তুত বিবৃতি সম্পর্কে জানুন, এবং PDO বা মাইএসকিউএলি ব্যবহার করুন- এই নিবন্ধটি আপনাকে সিদ্ধান্ত নিতে সহায়তা করবে। আপনি যদি PDO চয়ন করেন তবে এখানে একটি ভাল টিউটোরিয়াল রয়েছে

তবে যদি আপনার হয়, ব্যবহার করুন mysql_insert_id


এইটির সাথে সমস্যাটি হ'ল যদি আপনার প্রচুর সন্নিবেশ ঘটে থাকে (যেমন আপনার ডাটাবেসটিতে কিছু লগ হয়) তবে আপনি ভুল আইডি পেতে পারেন।
মাইক 18

না @Mike যদি আপনি ব্যবহার mysql_insert_id পরে আপনার mysql_query। অবশ্যই যদি আপনি এর মধ্যে একই সংযোগে আরও বেশ কয়েকটি ক্যোয়ারিকে কার্যকর করেন তবে ভাল, সেখানে আপনাকে সাহায্য করতে পারে এমন কিছুই নেই।
ছল

7
গ্যারান্টি দেওয়ার জন্য আপনি কখনও ভুল আইডি পাবেন না, একটি ট্রান্সঅ্যাকশন দিয়ে আপনার কোডটি মুড়িয়ে দিন ।
মার্সেলো অ্যাসিস

28
মাইএসকিএল নিশ্চিত করে যে এটি বর্তমান সংযোগের শেষ আইডি, সুতরাং সন্নিবেশ অনুসন্ধানের পরে আপনি যদি এই বিবৃতিটি সঠিকভাবে রাখেন তবে কোনও সমস্যা হবে না। সন্নিবেশ করানো অন্যান্য প্রক্রিয়া সম্পর্কে কোনও উদ্বেগ নেই this এটি কোনও লেনদেনের মধ্যে মোড়ানো প্রয়োজন। মাইএসকিএল ম্যানুয়ালটি বলে: "যে আইডি উত্পন্ন হয়েছিল তা প্রতি সংযোগের ভিত্তিতে সার্ভারে রক্ষণ করা হয় This এর অর্থ এই যে কোনও ফাংশন দ্বারা প্রদত্ত ক্লায়েন্টকে ফেরত দেওয়া মানটি একটি আউটপুট ক্রিমেন্টকে প্রভাবিত করে সাম্প্রতিকতম বিবৃতিটির জন্য উত্পন্ন প্রথম মান দ্বারা যে ক্লায়েন্ট । এই কারণে আপনি উচিত না নির্বাচন MAX টি (আইডি) ব্যবহার
woens

4
@ ভেবে দেখুন, এই পক্ষপাতদুষ্টতা নিয়ে PDOআমরা কোথায়ও দেখি? ফিচারটির তুলনা আবার দেখি । mysqliআপনি যখন নিম্ন স্তরের স্টাফ দিয়ে আপনার হাতটি নোংরা করতে হবে তখন এটি বিজয়ী তা স্পষ্ট । অন্য কথায়, এমনকি যদি কেউ পিডিও চয়ন করে তবে শেষ পর্যন্ত তাকে mysqliযেভাবেই ব্যবহার করা প্রয়োজন ।
পেসারিয়ার

52

বর্তমান সংযোগে সর্বশেষ আইডি sertedোকানো ছিল তা জানার জন্য একটি ফাংশন রয়েছে

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

প্লাস সর্বোচ্চ ব্যবহার করা একটি খারাপ ধারণা কারণ আপনার কোডটি একই সময়ে দুটি পৃথক সেশনে ব্যবহার করা হলে সমস্যা হতে পারে ।

এই ফাংশনটিকে mysql_insert_id বলা হয়


4
mysql _ (...) পিএইচপি> = 5.5 সংস্করণে অবচয় করা হয়েছে।
ইয়াগো

হ্যাঁ, আমি কেবল এটি মনে করছি। :)
ইয়াগো


19

সঙ্গে PDO :

$pdo->lastInsertId();

সঙ্গে Mysqli :

$mysqli->insert_id;

দয়া করে mysql_*নতুন কোডে ফাংশন ব্যবহার করবেন না । এগুলি আর রক্ষণাবেক্ষণ করা হয় না এবং সরকারীভাবে হ্রাস করা হয় । দেখুন লাল বক্স ? পরিবর্তে প্রস্তুত বিবৃতি সম্পর্কে জানুন, এবং PDO বা মাইএসকিউএলি ব্যবহার করুন- এই নিবন্ধটি আপনাকে সিদ্ধান্ত নিতে সহায়তা করবে। আপনি যদি PDO চয়ন করেন তবে এখানে একটি ভাল টিউটোরিয়াল রয়েছে



8

আপনি যা লিখেছেন idসেগুলি আপনাকে সর্বোত্তমভাবে ধরে নিবে যে তারা অনন্য এবং স্বতঃবৃদ্ধিযুক্ত যা ধরে নিলে সম্মতিযুক্ত ইস্যুগুলির সাথে আপনি ঠিক আছেন বলে ধরে নেওয়া ভাল।
যেহেতু আপনি মাইএসকিউএলটিকে আপনার ডাটাবেস হিসাবে ব্যবহার করছেন তাই এখানে নির্দিষ্ট ফাংশন রয়েছে LAST_INSERT_ID()যা কেবলমাত্র বর্তমান সংযোগটিতে কাজ করে যা সন্নিবেশ করায়।
পিএইচপি এটির জন্য একটি নির্দিষ্ট ফাংশন সরবরাহ করে mysql_insert_id


6

এটি ভাল কাজ করা উচিত চেষ্টা করুন:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);

4
দেখার জন্য আপনাকে ধন্যবাদ। আমি কোডটি সম্পাদনা করেছি, আসলে এটি $ লিঙ্ক (সংযোগ ধারণ করে পরিবর্তনশীল)
সন্ধু

3

কোডিগিটারে সর্বশেষ idোকানো আইডি পেতে সন্নিবেশ ক্যোয়ারী চালানোর পরে insert_id()ডাটাবেসে ডাকা একটি ফাংশন ব্যবহার করুন, এটি সর্বশেষ inোকানো আইডি ফিরে আসবে

প্রাক্তন:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

এক লাইনে

echo $this->db->insert('mytable',$data)->insert_id();

2

আপনি অন্তর্নির্মিত পিএইচপি ফাংশন দ্বারা সর্বশেষতম সন্নিবেশিত আইডি পেতে পারেন mysql_insert_id();

$id = mysql_insert_id();

আপনি একটি দ্বারা সর্বশেষ আইডি পাবেন

$id = last_insert_id();

5
এছাড়াও, এটি ভুল কারণ এটি অবজ্ঞাত লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছে। সত্যিই, এটি মুছুন
এসটিটি এলসিইউ

@ এসটিটিএলসিইউ এখানে কোন স্নিপেট হ্রাস করা হয়?
দ্য ব্ল্যাকবেঞ্জকিড

@ দ্য ব্ল্যাকবেঞ্জ দু'জনেই, কারণ তারা মাইএসকিএল_ * ফাংশনের উপর ভিত্তি করে রয়েছে
এসটিটি এলসিইউ

@ রাহুল $ আইডি = শেষ_মোজন_আইডি (); এটি হ্রাস করা হতে পারে হিসাবে কাজ করছে না।
এশা

2

এটি ব্যবহার করা ঠিক আছে mysql_insert_id(), তবে এটি ব্যবহার সম্পর্কে একটি নির্দিষ্ট নোট রয়েছে, আপনাকে একই স্ক্রিপ্ট সেশনের অর্থ নির্ধারিত INSERT ক্যোয়ারির পরে অবশ্যই এটি কল করতে হবে। আপনি যদি এটি অন্যথায় ব্যবহার করেন তবে এটি সঠিকভাবে কাজ করবে না।


2

পরিষ্কার এবং সহজ -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];

1

দ্রষ্টব্য: আপনি যদি একটি বিবৃতি mysqli :: insert_id দিয়ে একাধিক সন্নিবেশ করেন তবে এটি সঠিক হবে না।

টেবিল:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

এখন আপনি যদি:

insert into xyz (name) values('one'),('two'),('three');

মাইসকিলি :: সন্নিবেশ_আইড হবে 1 নয় 3।

সঠিক মান পেতে:

mysqli::insert_id + mysqli::affected_rows) - 1

এটি ডকুমেন্ট হয়েছে তবে এটি কিছুটা অস্পষ্ট।


1

আমি চাইলে টেবিলের সর্বশেষ স্বয়ংক্রিয়_আমারক আইডি পেতে খাঁটি মাইএসকিউএল সিনট্যাক্স ব্যবহার করতে পছন্দ করি।

php mysql_insert_id () এবং mysql last_insert_id () কেবল সর্বশেষ লেনদেনের আইডি দেয়।

আপনি যদি আপনার স্কিমাতে যে কোনও টেবিলের সর্বশেষ অটো_সিমেন্টেড আইডি চান (কেবলমাত্র সর্বশেষ লেনদেন নয়), আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

এটাই.


আমি এই সম্পর্কে সন্দেহজনক, যেহেতু এই এসকিউএল প্রশ্নের প্রসঙ্গে কেবল ভুল is এছাড়াও দুটি বা আরও বেশি ক্লায়েন্ট যখন একই এসকিউএল একই সময়ে চালায় তখন আমি নিশ্চিত নই ... আমি নিশ্চিত নই এই কলামের ডেটা fastোকানোর পরে কত দ্রুত আপডেট করা হয় যা আমাকে সন্দেহজনক করে তুলেছে ..। শেষ আইডিটি পেতে পারে এমন পিএইচপি ফাংশনগুলি সংযোগ / সেশন স্তরের উপর ভিত্তি করে (আরও বেশি কম মাইএসকিউএল এর ল্যাসT_INSERT_ID () এর মতো করে তোলে যা এটি রেস শর্ত সংরক্ষণ করে
রেমন্ড নিজল্যান্ড

1

উদাহরণ সহ কোনও উত্তর না পেয়ে দুঃখজনক।

মাইস্ক্লি :: sert সন্নিবেশ_আইডি ব্যবহার করে :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

পিডিও :: সর্বশেষতম আইডি ব্যবহার করে :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID

0

MySQLiলেনদেন ব্যবহার করে আমি মাঝে মাঝে পেতে সক্ষম হইনি mysqli::$insert_id, কারণ এটি 0 ফিরে এসেছে Especially বিশেষত যদি আমি সঞ্চিত পদ্ধতি ব্যবহার করি তবে এটি কার্যকর করে INSERT। সুতরাং লেনদেনের মধ্যে অন্য উপায় আছে:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>

0

ব্যবহারের mysqli যেমন MySQL depricating হয়

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>

-1

আমি চেষ্টা করেছিলাম

mysqli_insert_id($dbConnectionObj)

এটি বর্তমান সংযোগের সর্বশেষ .োকানো আইডিটি ফিরিয়ে দেয়, সুতরাং আপনি যদি নিজের সংযোগগুলি সঠিকভাবে পরিচালনা করছেন তবে এটি কাজ করা উচিত। অন্তত আমার জন্য কাজ করেছেন।



নেতিবাচক ভোটের তালিকার সাথে, এই অনর্থক পোস্টটি মডারেটরদের বিরক্ত করার পরিবর্তে সম্প্রদায় দ্বারা মুছে ফেলা যেতে পারে।
মিকম্যাকুসা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.