Ankündigung

Einklappen
Keine Ankündigung bisher.

mysql update query mit mehreren Tabellen funktioniert nicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mysql update query mit mehreren Tabellen funktioniert nicht

    folgendes ist mein query:
    Code:
    		$query = "
    			UPDATE
    				com_forum_list,
    				com_subboard_list,
    				com_board_list,
    				page_user_data
    			SET
    				forum_post_number = forum_post_number + 1,
    				forum_thread_number = forum_thread_number + 1,
    				forum_last_poster = ".$session->user_id.",
    				forum_last_post_at = NOW(),
    				forum_last_post = LAST_INSERT_ID(),
    				forum_last_thread = ".$new_thread_id.",
    				subboard_post_number = subboard_post_number + 1,
    				subboard_thread_number = subboard_thread_number + 1,
    				subboard_last_poster = ".$session->user_id.",
    				subboard_last_post = LAST_INSERT_ID(),
    				subboard_last_post_at = NOW(),
    				subboard_last_thread = ".$new_thread_id.",
    				board_post_number = board_post_number + 1,
    				board_thread_number = board_thread_number + 1,
    				board_last_poster = ".$session->user_id.",
    				board_last_post = LAST_INSERT_ID(),
    				board_last_post_at = NOW(),
    				board_last_thread = ".$new_thread_id.",
    				user_post_number = user_post_number + 1,
    				user_thread_number = user_thread_number + 1
    			WHERE
    				forum_id = ".$_GET['forum_id']." AND
    				forum_parent = subboard_id AND
    				subboard_parent = board_id AND
    				user_id = ".$session->user_id."
    		";
    
    		if (!$result = mysql_query($query))
    		{
    			die("mysql error: ".mysql_error());
    		}
    ---

    die(..) gibt dann folgenden Fehler zurueck:
    mysql error: You have an error in your SQL syntax near ' com_subboard_list, com_board_list, page_user_data SET forum_' at line 3
    ---

    die betroffenen Tabellen exisitieren und das Query funktioniert auch wenn ich nur eine dieser Tabellen nach update angebe und modifiziere. Der Tabellentyp ist MylSAM.

    weiss jemand was da schief laeuft/was ich falsch mache?

  • #2
    Du musst den entsprechenden Tabellennamen oder den verwendeten Alias vor die Feldnamen setzen. Ansonsten können die Felder den verschiedenen Tabellen nicht zugeordnet werden. Also bsp. statt
    Code:
                forum_last_post = LAST_INSERT_ID(), 
                forum_last_thread = ".$new_thread_id.", 
                subboard_post_number = subboard_post_number + 1, 
                subboard_thread_number = subboard_thread_number + 1,
    ist
    Code:
                com_forum_list.forum_last_post = LAST_INSERT_ID(), 
                com_forum_list.forum_last_thread = ".$new_thread_id.", 
                com_subboard_list.subboard_post_number = com_subboard_list.subboard_post_number + 1, 
                com_subboard_list.subboard_thread_number = com_subboard_list.subboard_thread_number + 1,
    erforderlich.

    Das es mit separaten Statements für jede Tabelle funktioniert ist einfach zu erklären, da es nur eine Tabelle gibt, auf die sich das Statement beziehen kann und die Tabelle in der die sich betroffenen Felder befinden damit eindeutig ist.

    In der MySQL-Dokumentation gibt es ein Beispiel für die Multiple-Table Syntax eines UPDATE-Statements, siehe http://dev.mysql.com/doc/mysql/en/UPDATE.html:

    Starting with MySQL 4.0.4, you can also perform UPDATE operations that cover multiple tables:

    UPDATE items,month SET items.price=month.price
    WHERE items.id=month.id;

    Kommentar


    • #3
      Zitat von carrib
      Du musst den entsprechenden Tabellennamen oder den verwendeten Alias vor die Feldnamen setzen. Ansonsten können die Felder den verschiedenen Tabellen nicht zugeordnet werden. Also bsp. statt
      Code:
                  forum_last_post = LAST_INSERT_ID(), 
                  forum_last_thread = ".$new_thread_id.", 
                  subboard_post_number = subboard_post_number + 1, 
                  subboard_thread_number = subboard_thread_number + 1,
      ist
      Code:
                  com_forum_list.forum_last_post = LAST_INSERT_ID(), 
                  com_forum_list.forum_last_thread = ".$new_thread_id.", 
                  com_subboard_list.subboard_post_number = com_subboard_list.subboard_post_number + 1, 
                  com_subboard_list.subboard_thread_number = com_subboard_list.subboard_thread_number + 1,
      erforderlich.

      Das es mit separaten Statements für jede Tabelle funktioniert ist einfach zu erklären, da es nur eine Tabelle gibt, auf die sich das Statement beziehen kann und die Tabelle in der die sich betroffenen Felder befinden damit eindeutig ist.
      Das ist nur richtig wenn die Tabellenfelder in den vers. Feldern die gleichen Namen haben, ansonsten kann MySQL die Felder eindeutig zuordnen. Ausserdem wuerde der Parser dann nicht gleich bei der dritten Zeile meckern sondern bei der 6, 7 oder achten.

      Zitat von carrib
      In der MySQL-Dokumentation gibt es ein Beispiel für die Multiple-Table Syntax eines UPDATE-Statements, siehe http://dev.mysql.com/doc/mysql/en/UPDATE.html:

      Starting with MySQL 4.0.4, you can also perform UPDATE operations that cover multiple tables:

      UPDATE items,month SET items.price=month.price
      WHERE items.id=month.id;
      Danke, da war mein Fehler ^^ hab nicht bedacht das der Server auf den ich den Quelltext aufspiele noch eine aeltere Version ist ^^

      Kommentar


      • #4
        Die Zuordnung der Felder wird sich wie bei einem SELECT verhalten, bin aber davon ausgegangen das Felder in verschiedenen Tabellen identisch benannt wurden. Ich gebe zu, dass ich mir die Fehlermeldung nicht sooooo ganz genau angeschaut habe

        Kommentar


        • #5
          nicht schlimm ^^ Problem ja trotzdem geloest ^^

          Kommentar


          • #6
            Also Problem habe ich jetzt geloest indem ich mehrere Abfragen an MySQL durchgefuehrt habe. Das unpraktische daran ist, das ich, da ich Daten aus den Tabellen brauche, aber Update nur die eine Tabelle lesen und schreiben kann, ich noch eine Menge SELECTs ausfuehren musste, um das hinzubekommen. Gibt es da eine bessere Moeglichkeit? Wie gesagt, kein Update auf mehrere Tabellen bei dem Server (v3.2..) nicht moeglich

            Quelltext:

            Code:
            /*update forum*/
            
            		$query = "
            			UPDATE
            				com_forum_list
            			SET
            				com_forum_list.forum_post_number = com_forum_list.forum_post_number + 1,
            				com_forum_list.forum_thread_number = com_forum_list.forum_thread_number + 1,
            				com_forum_list.forum_last_poster = ".$session->user_id.",
            				com_forum_list.forum_last_post_at = NOW(),
            				com_forum_list.forum_last_post = LAST_INSERT_ID(),
            				com_forum_list.forum_last_thread = ".$new_thread_id."
            			WHERE
            				com_forum_list.forum_id = ".$_GET['forum_id']."
            		";
            
            
            		if (!$result = mysql_query($query))
            		{
            			mdie("mysql error(3): ".mysql_error());
            		}
            
            /*update subboard*/
            
            		$query = "
            			SELECT
            				forum_parent
            			FROM
            				com_forum_list
            			WHERE
            				forum_id = ".$_GET['forum_id']."
            		";
            
            		if (!$result = mysql_query($query))
            		{
            			mdie("mysql error(4): ".mysql_error());
            		}
            
            		$temp = mysql_fetch_assoc($result);
            		$forum_parent = $temp['forum_parent'];
            
            		$query = "
            			UPDATE
            				com_subboard_list
            			SET
            				com_subboard_list.subboard_post_number = com_subboard_list.subboard_post_number + 1,
            				com_subboard_list.subboard_thread_number = com_subboard_list.subboard_thread_number + 1,
            				com_subboard_list.subboard_last_poster = ".$session->user_id.",
            				com_subboard_list.subboard_last_post = LAST_INSERT_ID(),
            				com_subboard_list.subboard_last_post_at = NOW(),
            				com_subboard_list.subboard_last_thread = ".$new_thread_id."
            			WHERE
            				 com_subboard_list.subboard_id = ".$forum_parent."
            		";
            
            		if (!$result = mysql_query($query))
            		{
            			mdie("mysql error(5): ".mysql_error());
            		}
            
            /*update board*/
            
            		$query = "
            			SELECT
            				subboard_parent
            			FROM
            				com_subboard_list
            			WHERE
            				subboard_id = ".$forum_parent."
            		";
            
            		if (!$result = mysql_query($query))
            		{
            			mdie("mysql error(6): ".mysql_error());
            		}
            
            		$temp = mysql_fetch_assoc($result);
            		$subboard_parent = $temp['subboard_parent'];
            
            		$query = "
            			UPDATE
            				com_board_list
            			SET
            				com_board_list.board_post_number = com_board_list.board_post_number + 1,
            				com_board_list.board_thread_number = com_board_list.board_thread_number + 1,
            				com_board_list.board_last_poster = ".$session->user_id.",
            				com_board_list.board_last_post = LAST_INSERT_ID(),
            				com_board_list.board_last_post_at = NOW(),
            				com_board_list.board_last_thread = ".$new_thread_id."
            			WHERE
            				com_board_list.board_id = ".$subboard_parent."
            		";
            
            		if (!$result = mysql_query($query))
            		{
            			mdie("mysql error(7): ".mysql_error());
            		}
            
            /*update user data*/
            
            		$query = "
            			UPDATE
            				page_user_data
            			SET
            				page_user_data.user_post_number = page_user_data.user_post_number + 1,
            				page_user_data.user_thread_number = page_user_data.user_thread_number + 1
            			WHERE
            				page_user_data.user_id = ".$session->user_id."
            		";
            
            		if (!$result = mysql_query($query))
            		{
            			mdie("mysql error(8): ".mysql_error());
            		}

            Kommentar

            Lädt...
            X