Sancho: id des betroffenen Datensatzes

Beitrag lesen

Hallo HendrikX, hallo Tom,

@Tom:

"Für den Fall, dass ein zweiter Aufruf von mysql_connect() mit den gleichen Argumenten erfolgt, wird keine neue Verbindung aufgebaut, sondern die Verbindungs-Kennung der schon bestehenden Verbindung zurückgeliefert."
»»
[was ja im Falle von zwei zeitgleich verarbeiteten Scripten bzw. zwei nahe beieinanderliegenden HTTP-Aufrufen des »» »» gleichen Scripts durchaus der Fall sein kann...]

Ein PHP-Script betreibt kein automatisches Threading in dem Resource- und Connection-Handles vererbt werden könnten.
(...)

Hastu völlig recht.
Das Zitat bezieht sich natürlich nur auf mehrere Aufrufe von mysql_connect innerhalb _eines_ verarbeiteten Scripts. Wenn dasselbe Script von _mehreren_ PHP-Interpreter-Instanzen _zeitgleich_ verarbeitet wird - z.B. weil es von verschiedenen Clients unmittelbar nacheinander per HTTP abgerufen wird - dann wird natürlich pro Interpreter-Instanz jeweils eine neue Verbindung hergestellt. Habe das mal mit folgendem Script getestet (W2K/Apache 2.0.52/PHP 5.0.2):

<?php // test.php

$CNX = mysql_connect('localhost', '[user]', '[pass]');

mysql_select_db('[dbname]', $CNX);

echo "Verbindungs-Kennung: $CNX <br />";

mysql_query("INSERT INTO [tabelle mit auto-inkrement-Spalte] SET [feld] = '[wert]', $CNX");

if (isset($_GET['wait']))
{
  echo 'Verarbeitung dauert länger...<br />';
  sleep(15);
}

echo 'LAST_INSERT_ID: ', mysql_insert_id($CNX);

?>

Beim Aufruf über 'test.php?wait=1' gibt mysql_insert_id($CNX) immer die jeweils richtige ID der letzten Einfügung zurück, auch wenn ich während der Sleep-Pause in einem anderen Browser-Tab mehrfach 'test.php' [ohne $_GET-Parameter] aufrufe.

  • Aufruf 'test.php?wait=1'

...

  • Aufruf 'test.php' [ohne $_GET-Parameter, in einem anderen Browser-Tab]
      Ausgabe :
        Verbindungs-Kennung: Resource id #1
        LAST_INSERT_ID: 1

  • Wiederholter Aufruf 'test.php'
      Ausgabe :
        Verbindungs-Kennung: Resource id #1
        LAST_INSERT_ID: 2

  • Wiederholter Aufruf 'test.php'
      Ausgabe :
        Verbindungs-Kennung: Resource id #1
        LAST_INSERT_ID: 3

...

  • Ausgabe von 'test.php?wait=1':

Verbindungs-Kennung: Resource id #1
    Verarbeitung dauert länger...
    LAST_INSERT_ID: 0

[PHPs 'Resource id' ist nur eine Script-interne Verbindungs-Kennung.]
Die Verbindung, die für 'test.php?wait=1' aufgebaut wurde, bleibt für die Verarbeitungszeit dieses Scripts ausschließlich diesem Script bzw. der entsprechenden verarbeitenden Interpreter-Instanz vorbehalten.

@HendrikX:

Also ist hier wohl doch kein 'hartes Brot' zu befürchten (sondern - zumindest für mich - nur dieser zusätzliche 'Kenntnis-Krümel' entstanden; Ihr beide habt das ja vielleicht eh scho gwusst. ;-)

Grüße,

Sancho