Yadgar: MySQL: Primärschlüsselwert wird nicht gefunden

Hi(gh)!

Ich versuche mal wieder, eine Datenbank mitsamt PHP-Eingabemaske zum Laufen zu bringen... nichts Großes, gerade mal sieben Tabellen, klappte bis jetzt auf meinem Windows-Laptop ganz gut (bis auf einen 1054er, aber das ist ein anderes Thema), aber dann exportierte ich die Datenbank nach Linux - und jetzt stelle ich fest, dass der Primärschlüsselwert in einer der Tabellen nicht korrekt gefunden wird, obwohl die Suchkriterien stimmen, kommt immer nur 0 raus... am besten, ich gebe euch mal den ganzen Code, angefangen mit dem MySQL-Dump:


-- phpMyAdmin SQL Dump
-- version 2.9.1.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 09. August 2013 um 13:32
-- Server Version: 5.0.27
-- PHP-Version: 5.2.0
--
-- Datenbank: `schwingungen`
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `interpret`
--

CREATE TABLE `interpret` (
  `ID` smallint(5) unsigned NOT NULL auto_increment,
  `Name` varchar(80) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `Name` (`Name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=13 ;

--
-- Daten für Tabelle `interpret`
--

INSERT INTO `interpret` VALUES (1, 'Raukes, Dorothea');
INSERT INTO `interpret` VALUES (2, 'The League Unlimited Orchestra');
INSERT INTO `interpret` VALUES (3, 'Tietchens, Asmus');
INSERT INTO `interpret` VALUES (4, 'McCann, Les');
INSERT INTO `interpret` VALUES (5, 'Großkopf, Harald');
INSERT INTO `interpret` VALUES (6, 'Tangerine Dream');
INSERT INTO `interpret` VALUES (7, 'Scholl, Bernd');
INSERT INTO `interpret` VALUES (8, 'Earthstar');
INSERT INTO `interpret` VALUES (9, 'Blenner, Serge');
INSERT INTO `interpret` VALUES (10, 'Pluta, Jürgen');
INSERT INTO `interpret` VALUES (11, 'von Deyen, Adelbert');
INSERT INTO `interpret` VALUES (12, 'Schulze, Klaus');

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `sendung`
--

CREATE TABLE `sendung` (
  `ID` smallint(5) unsigned NOT NULL auto_increment,
  `Datum` date NOT NULL,
  `Status` tinyint(1) NOT NULL,
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `Datum` (`Datum`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ;

--
-- Daten für Tabelle `sendung`
--

INSERT INTO `sendung` VALUES (2, '1984-01-05', 2);
INSERT INTO `sendung` VALUES (3, '1984-01-19', 2);
INSERT INTO `sendung` VALUES (8, '1984-02-02', 2);
INSERT INTO `sendung` VALUES (5, '1984-01-26', 3);
INSERT INTO `sendung` VALUES (7, '1981-12-24', 1);

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `sendung_titel`
--

CREATE TABLE `sendung_titel` (
  `ID` smallint(5) unsigned NOT NULL auto_increment,
  `Sendung` smallint(5) unsigned NOT NULL,
  `Titel` smallint(5) unsigned NOT NULL,
  `Position` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

--
-- Daten für Tabelle `sendung_titel`
--


-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `status`
--

CREATE TABLE `status` (
  `ID` tinyint(3) unsigned NOT NULL auto_increment,
  `Bezeichnung` varchar(20) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `Bezeichnung` (`Bezeichnung`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;

--
-- Daten für Tabelle `status`
--

INSERT INTO `status` VALUES (1, 'Pilotsendung');
INSERT INTO `status` VALUES (2, 'Regulär');
INSERT INTO `status` VALUES (3, 'Irregulär');

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `titel`
--

CREATE TABLE `titel` (
  `ID` smallint(6) unsigned NOT NULL auto_increment,
  `Name` varchar(80) collate utf8_unicode_ci NOT NULL,
  `Interpret` smallint(5) unsigned NOT NULL,
  `Veroeffentlichung` smallint(5) unsigned NOT NULL,
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `Name` (`Name`,`Interpret`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

--
-- Daten für Tabelle `titel`
--


-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `typ`
--

CREATE TABLE `typ` (
  `ID` tinyint(3) unsigned NOT NULL auto_increment,
  `Bezeichnung` varchar(20) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `Bezeichnung` (`Bezeichnung`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;

--
-- Daten für Tabelle `typ`
--

INSERT INTO `typ` VALUES (1, 'Album');
INSERT INTO `typ` VALUES (2, 'Compilation');
INSERT INTO `typ` VALUES (3, 'Sampler');
INSERT INTO `typ` VALUES (4, 'EP');
INSERT INTO `typ` VALUES (5, 'Single');
INSERT INTO `typ` VALUES (6, 'Maxi-Single');

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `veroeffentlichung`
--

CREATE TABLE `veroeffentlichung` (
  `ID` smallint(5) unsigned NOT NULL auto_increment,
  `Name` varchar(80) collate utf8_unicode_ci NOT NULL,
  `Typ` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `Name` (`Name`,`Typ`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=13 ;

--
-- Daten für Tabelle `veroeffentlichung`

-- 

INSERT INTO `veroeffentlichung` VALUES (1, 'Deutsche Wertarbeit', 1);
INSERT INTO `veroeffentlichung` VALUES (2, 'Love And Dancing', 1);
INSERT INTO `veroeffentlichung` VALUES (3, 'In die Nacht', 1);
INSERT INTO `veroeffentlichung` VALUES (4, 'Layers', 1);
INSERT INTO `veroeffentlichung` VALUES (5, 'Synthesist', 1);
INSERT INTO `veroeffentlichung` VALUES (6, 'Logos Live', 1);
INSERT INTO `veroeffentlichung` VALUES (7, 'Tales Of Fantasy', 1);
INSERT INTO `veroeffentlichung` VALUES (8, 'Humans Only', 1);
INSERT INTO `veroeffentlichung` VALUES (9, 'Magazin Frivole', 1);
INSERT INTO `veroeffentlichung` VALUES (10, 'Communication', 1);
INSERT INTO `veroeffentlichung` VALUES (11, 'Planetary', 1);
INSERT INTO `veroeffentlichung` VALUES (12, 'X', 1);

und das PHP-Skript mit dem oben genannten Problem:


<?php
  require("head_schwingungen.php");
	head("Schwingungen - Dateneingabe: titel");
?>
  <body>
<?
  require("navbar_schwingungen.php");
?>
  <div style="position:absolute; width:74%; top:0px; left:26%; padding-left:5px">
    <h2>Schwingungen: Dateneingabe</h2>
    <h3>Datentabelle: titel</h3>
    <form method="post" action="titel.php">
      <table>
        <tr>
          <td>
            <b>Name: </b>
          </td>
          <td>
            <input type="text" name="Name">
	  </td>
        </tr>
	<tr>
	  <td>
	    <b>Interpret: </b>
	  </td>
	  <td>
	    <select name="Interpret">
	    <option value="">Interpret auswählen</option>
	    <?
	      dbcall();
	      $query = "SELECT Name FROM interpret ORDER BY Name";
	      $result = mysql_query($query);
	      dberror();
	      while ($row = mysql_fetch_row($result))
              {
	        dberror();
  	        ?><option value="<? echo $row[0]; ?>"><? echo $row[0]; ?>
	        </option><?
	      }
   	    ?>
	    </select>
          </td>
        </tr>
	<tr>
	  <td>
	    <b>Veröffentlichung: </b>
	  </td>
	  <td>
	    <select name="Veroeffentlichung">
	    <option value="">Veroeffentlichung auswählen</option>
	    <?
	      dbcall();
	      $query = "SELECT veroeffentlichung.Name, typ.Bezeichnung FROM veroeffentlichung, typ WHERE veroeffentlichung.Typ = typ.ID ORDER BY Name";
	      $result = mysql_query($query);
	      dberror();
	      while ($row = mysql_fetch_row($result))
	      {
		dberror();
		$opstring = $row[0]." [".$row[1]."]";
  		?><option value="<? echo $opstring; ?>"><? echo $opstring; ?>
		</option><?
	      }
	    ?>
	    </select>
	  </td>
        </tr>				
      </table>
      <p>
	<input type="submit" value="Daten absenden">
      </p>
    </form>		
  <?
		$Name = $_POST['Name'];
		$Interpret = $_POST['Interpret'];
		$Veroeffentlichung = $_POST['Veroeffentlichung'];
    if (!$Name || !$Interpret || !$Veroeffentlichung)
		  echo "Bitte geben Sie einen Titel, einen Interpreten und eine Veröffentlichung ein!<br>";
		else
		{
			dbcall();
			$query = "SELECT ID FROM interpret WHERE Name = '".mysql_real_escape_string($Interpret)."'";
			$result = mysql_query($query);
			dberror();
			$row = mysql_fetch_row($result); // interpret.ID
			$ids[0] = $row[0];
			// echo $ids[0]."<br>";
			dbcall();
			
      $Veroeff = explode(" [", $Veroeffentlichung);
			$Veroeffentlichung = $Veroeff[0];
			$Typ = str_replace("]", "", $Veroeff[1]);
			
			$query = "SELECT ID FROM typ WHERE Bezeichnung = '".mysql_real_escape_string($Typ)."'";
			$result = mysql_query($query);
			dberror();
			$row = mysql_fetch_row($result);
			echo $Typ."<br>";
			$query = "SELECT ID FROM veroeffentlichung WHERE Name = '".mysql_real_escape_string($Veroeffentlichung)."' AND Typ = '".mysql_real_escape_string($row[0])."'";
			$result = mysql_query($result);
			dberror();
			$row = mysql_fetch_row($result);
			echo $Veroeffentlichung."<br>";
			echo $row[0]."<br>";
			$ids[1] = $row[0];
			
			$query = "INSERT INTO titel (Name, Interpret, Veroeffentlichung) VALUES ('".mysql_real_escape_string($Name)."','".mysql_real_escape_string($ids[0])."','".mysql_real_escape_string($ids[1])."')";
			$result = mysql_query($query);
			dberror();
			echo "Ihre Eingabe war korrekt und wurde in die Datenbank eingetragen!";
			$db = mysql_close();
			dberror();
		}
	?>
  </div>
							<p style="text-align:center; position:absolute; left:26%; width:74%; top:500px">
	   <a href="titel_kontrolle.php" target="_blank">Kontrollansicht der Tabelle (in neuem Fenster)</a>
  </body>
</html>	

und noch die inkludierte Datei mit den Funktionen:


<?php
  function head($title)
	{
    echo '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"';
	  echo '  "http://www.w3.org/TR/html4/loose.dtd">';
    echo '<html>';
    echo '  <head>';
		echo '    <title>'.$title.'</title>';		
	  echo '    <meta http-equiv="Content-Type" content="text/html; charset=utf8">';
		echo '    <style>';
		echo '      p { font-size:12px }';
		echo '    </style>';
		echo '  </head>';
	}
	
	function dberror()
	{
	  if (mysql_errno())
		{
      switch(mysql_errno())
			{
			  case 1062:
				  die ("Ein Eintrag mit diesen Daten existiert bereits! Bitte korrigieren Sie Ihre Eingabe!<br>");
				break;
				default:
				  die (mysql_errno().": ".mysql_error()."<br>");
				break;
			}
  	}
	}

	function dbcall()
	{
		$db = mysql_connect("localhost", "root", "Menkalinan");
		dberror();
		$db = mysql_select_db("schwingungen");
		dberror();
	}		
?>	

Ich blicke mal wieder nicht mehr durch! Bin ich zu dumm zum Programmieren?!?

Bis bald im Khyberspace!

Yadgar

  1. Moin,
    Wo genau kommt 0 raus? (Oder Null?)
    Füg doch einfach mal zu Debug-Zwecken eine komplettausgabe aller deiner Tabellen an, vielleicht steht ja was verkehrtes drin oder überhauptgarnix. Du könntest nebenbei bemerkt statt den Namenswerten auch die IDs über die <select> Eingabefelder übergeben!?!
    Cheers,
    FrankF

    1. Hi(gh)

      Moin,
      Wo genau kommt 0 raus? (Oder Null?)
      Füg doch einfach mal zu Debug-Zwecken eine komplettausgabe aller deiner Tabellen an, vielleicht steht ja was verkehrtes drin oder überhauptgarnix. Du könntest nebenbei bemerkt statt den Namenswerten auch die IDs über die <select> Eingabefelder übergeben!?!
      Cheers,
      FrankF

      Also, los geht's:

      Tabelle "interpret":

        
      +----+--------------------------------+  
      | ID | Name                           |  
      +----+--------------------------------+  
      |  1 | Raukes, Dorothea               |  
      |  2 | The League Unlimited Orchestra |  
      |  3 | Tietchens, Asmus               |  
      |  4 | McCann, Les                    |  
      |  5 | Großkopf, Harald              |  
      |  6 | Tangerine Dream                |  
      |  7 | Scholl, Bernd                  |  
      |  8 | Earthstar                      |  
      |  9 | Blenner, Serge                 |  
      | 10 | Pluta, Jürgen                 |  
      | 11 | von Deyen, Adelbert            |  
      | 12 | Schulze, Klaus                 |  
      +----+--------------------------------+  
      
      

      Tabelle "sendung":

        
      +----+------------+--------+  
      | ID | Datum      | Status |  
      +----+------------+--------+  
      |  2 | 1984-01-05 |      2 |  
      |  3 | 1984-01-19 |      2 |  
      |  5 | 1984-01-26 |      3 |  
      |  7 | 1981-12-24 |      1 |  
      |  8 | 1984-02-02 |      2 |  
      +----+------------+--------+  
      
      

      Tabelle "sendung_titel":

      noch leer

      Tabelle "status":

        
      +----+--------------+  
      | ID | Bezeichnung  |  
      +----+--------------+  
      |  1 | Pilotsendung |  
      |  2 | Regulär     |  
      |  3 | Irregulär   |  
      +----+--------------+  
      
      

      Tabelle "titel":

        
      +----+-----------------------------+-----------+-------------------+  
      | ID | Name                        | Interpret | Veroeffentlichung |  
      +----+-----------------------------+-----------+-------------------+  
      |  1 | Guten Abend Leute           |         1 |                 0 |  
      |  2 | Open Your Heart             |         2 |                 0 |  
      |  3 | In die Nacht                |         3 |                 0 |  
      |  4 | Soaring Part II             |         4 |                 0 |  
      |  5 | So weit, so gut             |         5 |                 0 |  
      |  6 | Logos Part One              |         6 |                 0 |  
      |  7 | Journey (Through The Night) |         7 |                 0 |  
      |  8 | One Flew Over The Ridge     |         8 |                 0 |  
      |  9 | Polyphase                   |         9 |                 0 |  
      | 10 | Afghatopia                  |        10 |                 0 |  
      | 11 | sdfsdf                      |         8 |                 0 |  
      +----+-----------------------------+-----------+-------------------+  
      
      

      Tabelle "typ":

        
      +----+-------------+  
      | ID | Bezeichnung |  
      +----+-------------+  
      |  1 | Album       |  
      |  2 | Compilation |  
      |  3 | Sampler     |  
      |  4 | EP          |  
      |  5 | Single      |  
      |  6 | Maxi-Single |  
      +----+-------------+  
      
      

      Tabelle "veroeffentlichung":

        
      +----+---------------------+-----+  
      | ID | Name                | Typ |  
      +----+---------------------+-----+  
      |  1 | Deutsche Wertarbeit |   1 |  
      |  2 | Love And Dancing    |   1 |  
      |  3 | In die Nacht        |   1 |  
      |  4 | Layers              |   1 |  
      |  5 | Synthesist          |   1 |  
      |  6 | Logos Live          |   1 |  
      |  7 | Tales Of Fantasy    |   1 |  
      |  8 | Humans Only         |   1 |  
      |  9 | Magazin Frivole     |   1 |  
      | 10 | Communication       |   1 |  
      | 11 | Planetary           |   1 |  
      | 12 | X                   |   1 |  
      +----+---------------------+-----+  
      
      

      Bis bald im Khyberspace!

      Yadgar

  2. Tach!

    und jetzt stelle ich fest, dass der Primärschlüsselwert in einer der Tabellen nicht korrekt gefunden wird, obwohl die Suchkriterien stimmen, kommt immer nur 0 raus... am besten, ich gebe euch mal den ganzen Code, angefangen mit dem MySQL-Dump:

    Nee, so wird das nichts. Zum einen hast du das Problem nicht nachvollziehbar beschrieben. Was machst du, was erwartest du, was bekommst du? Und all das bitte konkret beschreiben.

    Die potentiellen Antworter sind keine XAMP-Systeme. Zuviel Code, der mit dem eigentlichen Problem nichts zu tun hat, senkt eher die Antwortwilligkeit. Wenn du vom DBMS ein unerwartetes Ergebnis bekommst, interessiert mich der PHP-Code nicht, sondern nur die Query und die dazugehörigen Tabellen und Testdaten. Wenn du jedoch PHP als die Ursache annimmst, dann möchte ich einen auf das Problem beschränkten Code haben und nicht das komplette Programm. Und wenn du diesen "Forderungen" nachkommst, hilft es aber auch dir selbst beim Einkreisen des Problems.

    Ich sehe aber auf Anhieb, dass du allem Anschein nach ein Zeichenkodierungsproblem hast, was du vermutlich selbst noch gar nicht gemerkt hast.

    CREATE TABLE status (
      ID tinyint(3) unsigned NOT NULL auto_increment,
      Bezeichnung varchar(20) collate utf8_unicode_ci NOT NULL,
      PRIMARY KEY  (ID),
      UNIQUE KEY Bezeichnung (Bezeichnung)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;

    --
    -- Daten für Tabelle status

    INSERT INTO status VALUES (1, 'Pilotsendung');
    INSERT INTO status VALUES (2, 'Regulär');
    INSERT INTO status VALUES (3, 'Irregulär');

    Solange du keine Umkodierung des Dumps vorgenommen hast oder ihn im Editor mit der falschen Kodierungseinstellung geöffnet hast, deutet das darauf hin, dass MySQL statt der ä die beiden hier zu sehenden Zeichen "sieht". Prüfen kannst du das über:
    SELECT *, CHAR_LENGTH(Bezeichnung) FROM status
    Wenn das für die Zeilen 2 und 3 als Ergebnis 7 und 9 ergibt, ist alles bestens. Bei 8 und 10 hast du aber das vermutete Problem.

    function dbcall()
    {
    $db = mysql_connect("localhost", "root", "Menkalinan");
    dberror();
    $db = mysql_select_db("schwingungen");
    dberror();
    }

    Nach dem Verbindungsaufbau hast du keine Angabe zur zu verwenden Zeichenkodierung gemacht. Vermutlich sendest du UTF-8, MySQL geht aber per Default von ISO-8859-1/Latin1 aus. Damit erkennt es die Bytesequenzen von Nicht-ASCII-Zeichen als einzelne Zeichen. Auf dem Rückweg passiert das Ganze mit umgekehrten Vorzeichen, womit sich der Fehler wieder aufhebt und du ihn nicht direkt bemerkst.

    dedlfix.

    1. Hi(gh)!

      SELECT *, CHAR_LENGTH(Bezeichnung) FROM status
      Wenn das für die Zeilen 2 und 3 als Ergebnis 7 und 9 ergibt, ist alles bestens. Bei 8 und 10 hast du aber das vermutete Problem.

      Bingo! Genau das ist passiert:

      +----+--------------+--------------------------+
      | ID | Bezeichnung  | CHAR_LENGTH(Bezeichnung) |
      +----+--------------+--------------------------+
      |  1 | Pilotsendung |                       12 |
      |  2 | Regulär     |                        8 |
      |  3 | Irregulär   |                       10 |
      +----+--------------+--------------------------+

      Nach dem Verbindungsaufbau hast du keine Angabe zur zu verwenden Zeichenkodierung gemacht. Vermutlich sendest du UTF-8, MySQL geht aber per Default von ISO-8859-1/Latin1 aus.

      Ich habe die Funktion dbcall() entsprechend geändert, d. h.

        
      function dbcall()  
      {  
        $db = mysql_connect("localhost", "root", "Menkalinan");  
        mysql_set_charset('utf8', $db);  
        dberror();  
        $db = mysql_select_db("schwingungen");  
        dberror();  
      }  
      
      

      Die Sonderzeichen werden in meiner Eingabemaske nach wie vor "verhackt" dargestellt - und der Fehler mit den nicht gefundenen ID-Nummern aus "veroeffentlichung" tritt weiterhin auf!

      Bis bald im Khyberspace!

      Yadgar

      1. Hi(gh)!

        Die Sonderzeichen werden in meiner Eingabemaske nach wie vor "verhackt" dargestellt - und der Fehler mit den nicht gefundenen ID-Nummern aus "veroeffentlichung" tritt weiterhin auf!

        Ich habe zwischenzeitlich den Grund für den fehlerhaften ID-Eintrag in "titel" gefunden:
        statt

        $result = mysql_query($query);

        stand an der fraglichen Stelle

        $result = mysql_query($result);

        Da kann natürlich nur 0 gesetzt werden!

        Bis bald im Khyberspace!

        Yadgar

      2. Tach!

        [vermutetes Zeichenkodierungsproblem]
        Bingo! Genau das ist passiert:

        Dann solltest du mal mit dem phpMyAdmin deine Daten korrigieren. Der müsste sie ebenfalls falsch anzeigen.

        Die Sonderzeichen werden in meiner Eingabemaske nach wie vor "verhackt" dargestellt - und der Fehler mit den nicht gefundenen ID-Nummern aus "veroeffentlichung" tritt weiterhin auf!

        Die Umlaute bekommst du korrigiert, und mit dem mysql_set_charset() ist dieses Problem erstmal gelöst. Aber dein eigentliches Problem hast du noch nicht nachvollziehbar beschrieben. Ich hab sogar mal dein Script laufen lassen, weiß aber nicht, was ich da nun tun soll, um deinen Fehler zu bekommen. Die Benutzeroberfläche ist auch nicht sehr intuitiv.

        dedlfix.