mysqlfan: Formulardaten werden nicht an SQL-Tabelle übergeben

Moin!

Hab hier ein mysteriöses Problem:

Ich hab mal eine Buchverwaltung angelegt, wo man Bücher per PHP-Skript (also Formular) in die Datenbank "book", Tabelle "books" eintragen kann. Funktionierte bislang.

Dann hab ich die Datenbank DVD mit der Tabelle movie angelegt und wollte entsprechend nur die Variablen, etc. abändern, aber es werden keine Daten an die DB übergeben bzw. in die Tabelle reingeschrieben.

Ich hab jede einzelne Zeile gecheckt, woran es liegen könnte, aber komme nicht weiter.

Hier der Code der php:

<?php  
include('database.inc.php');  
$detail_action = 'change';  
$detail_actiontext = '&Auml;ndern';  
if ($_SERVER['REQUEST_METHOD']=='GET' && isset($_GET['action']))  
{  
switch ($_GET['action'])  
{  
case 'new':  
$detail_action = 'new';  
$detail_actiontext = 'Erfassen';  
break;  
}  
}  
if ($_SERVER['REQUEST_METHOD']=='POST' && isset($_POST['action']))  
{  
switch ($_POST['action'])  
{  
case 'new':  
$mysqli->query("INSERT INTO movie  
(id, dvdid, produktionsjahr, film_cinema_release)  
VALUES ('{$_POST['dvd_dvdid']}',  
'{$_POST['dvd_produktionsjahr']}',  
'{$_POST['dvd_film_cinema_release']}',  
)");  
break;  
  
case 'change':  
$mysqli->query("UPDATE movie SET  
dvdid='{$_POST['dvd_dvdid']}',  
produktionsjahr='{$_POST['dvd_produktionsjahr']}',  
film_cinema_release='{$_POST['dvd_film_cinema_release']}',  
WHERE id = {$_POST['id']}");  
  
break;  
}  
}  
$query = $mysqli->query("SELECT * FROM movie");  
while($arr = $query->fetch_assoc())  
{  
$movie[] = $arr;  
}  
// Details abrufen, wenn gefordert  
if (isset($_GET['id']))  
{  
  
  
  
$detail = $query->fetch_assoc();  
  
//Diese Zeile funktioniert nicht!!  
  
  
$detail_id = $detail['id'];  
$detail_dvdid = $detail['dvdid'];  
$detail_produktionsjahr= $detail['produktionsjahr'];  
$detail_film_cinema_release = $detail['film_cinema_release'];  
}  
  
?>

Hier der HTML-Auszug:

  
<td>  
<a href="http://localhost/index1.php?TEMPLATE=buecher&amp;id={$movie:id}&amp;action=show">  
  
Details  
</a>  
</td>  
</tr>  
<!-- #ENDREPEAT:movie -->  
</table>  
<a href="http://localhost/index1.php?TEMPLATE=buecher&amp;action=new">Neues Buch erfassen</  
a>  
<h3>&Auml;ndern&nbsp;/&nbsp;Erfassen</h3>  
<form action="http://localhost/index1.php?TEMPLATE=buecher" method="post">  
<input type="hidden" name="action" value="{$detail_action}" />  
<input type="hidden" name="id" value="{$detail_id}" />  
<table border="1" width="400">  
<caption style="font-weight:bold">CD-Daten</caption>  
<tr>  
<td>  
CD-ID:  
</td>  
<td>  
<input type="text" name="dvd_dvdid" value="{$detail_dvdid}" size="8" maxlength="8"/>  
</td>  
</tr>  
<tr>  
<td>  
produktionsjahrnummer:  
</td>  
<td>  
<input type="text" name="dvd_produktionsjahr" value="{$detail_produktionsjahr}" size="3" maxlength="3"/>  
</td>  
</tr>  
<tr>  
<td>  
film_cinema_release:  
</td>  
<td>  
<input type="text" name="dvd_film_cinema_release" value="{$detail_film_cinema_release}" size="70"/>  
</td>  
</tr>  
<tr>  
<td>  
</td>  
<td>  
<input type="submit" value="{$detail_actiontext}" />  
</td>  
</tr>  
</table>  
</form>  
</body>  
</html>  

Die Ausgabe mit

  
if($_POST){  
echo'<pre>',print_r($_POST),'<pre>';  
}  

ergibt

--------------------
Array
(
[action] => new
[id] =>
[dvd_dvdid] => 1
[dvd_produktionsjahr] => 9 (trägt in der DB dann 2009 ein)
[dvd_film_cinema_release] => 9 (trägt in der DB dann 2009 ein)
)
1
--------------------

id ist in der DB auf auto_increment gesetzt und muss demnach keinen Wert übergeben.

Hab die Daten auch mal direkt bei phpmyadmin in die MySQL-DB geschrieben, ob es irgendwo Fehler gibt und aus dem Grund der ganze Datensatz nicht geschrieben wird, aber dem ist nicht so. Bei der direkten Eingabe wird von der DB alles sauber eingetragen.

Sprich: Alle Bedingungen sind so, wie bei der DB book, Tabelle books auch - nur da läufts und bei der DVD movie läufts nicht.

Muss irgendwo noch was geswitcht werden, bzw. muss eine Grundeinstellung noch irgendwo vorgenommen werden?

Für jede Hilfe besten Dank!

  1. Hi!

    Dann hab ich die Datenbank DVD mit der Tabelle movie angelegt und wollte entsprechend nur die Variablen, etc. abändern, aber es werden keine Daten an die DB übergeben bzw. in die Tabelle reingeschrieben.

    PHP-Fehlermeldungen kommen auch keine, wenn das error_reporting auf E_ALL (und display_errors auf on) steht?

    $mysqli->query("INSERT INTO movie
    (id, dvdid, produktionsjahr, film_cinema_release)
    VALUES ('{$_POST['dvd_dvdid']}',
    '{$_POST['dvd_produktionsjahr']}',
    '{$_POST['dvd_film_cinema_release']}',
    )");

    Der Kontextwechsel wird nicht beachtet, was zu SQL-Injection führen kann. Außerdem fragst du weder ab, ob die Query erfolgreich war noch eventuelle MySQL-Fehlermeldungen.

    Lo!

    1. PHP-Fehlermeldungen kommen auch keine, wenn das error_reporting auf E_ALL (und display_errors auf on) steht?

      Nein, es kommen keine Fehlermeldungen.
      error_reporting steht auf E_ALL und display_errors auf on.
      Der Kontextwechsel wird nicht beachtet, was zu SQL-Injection führen kann. »» Außerdem fragst du weder ab, ob die Query erfolgreich war noch eventuelle »» MySQL-Fehlermeldungen.

      Ja, ich weiß, dass der Code in dem Punkt nicht sauber ist. Aber das ist im Moment egal, weil diese DB erst mal nur lokal mit mir als Einzeluser verwendet werden soll.

      Das Problem ist primär, dass keine Daten übergeben werden - aus welchem Grund auch immer.

      1. Hi!

        Der Kontextwechsel wird nicht beachtet, was zu SQL-Injection führen kann. Außerdem fragst du weder ab, ob die Query erfolgreich war noch eventuelle MySQL-Fehlermeldungen.
        Ja, ich weiß, dass der Code in dem Punkt nicht sauber ist. Aber das ist im Moment egal, weil diese DB erst mal nur lokal mit mir als Einzeluser verwendet werden soll.

        Auch Einzeluser geben ab und an Daten ein, die ein ' enthalten. Das zu beachten ist keine Option sondern eine Pflichtveranstaltung.

        Das Problem ist primär, dass keine Daten übergeben werden - aus welchem Grund auch immer.

        Welches das "primäre Problem" ist, sollst du erst einmal rausfinden. Deswegen sollst du ja die Fehler analysieren, beziehungsweise dich davon überzeugen, dass keine da sind. Also schau dir den Rückgabewert von mysqli::query() an.

        Lo!

        1. Also schau dir den Rückgabewert von mysqli::query() an.

          Ich bekomme bei Einfügen von

          $result = mysql_query($query) or die(mysql_error());

          Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\buecher.php on line 100

          Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\xampp\htdocs\buecher.php on line 100
          Access denied for user 'ODBC'@'localhost' (using password: NO)

          Aber ich kann mir nicht erklären, warum es bei dem einen geht und hier nicht.

          1. Hi!

            Also schau dir den Rückgabewert von mysqli::query() an.
            Ich bekomme bei Einfügen von
            $result = mysql_query($query) or die(mysql_error());

            Was hat das mit deinem Problem zu tun? Warum untersuchst du nicht die Variablen und Rückgabewerte, die in deinem Code enthalten sind? Du verwendest die mysqli-Extension, also lass die Funktionen der mysql-Extension unbeachtet.

            Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\buecher.php on line 100

            Ohne mysql_connect() werden Default-Daten verwendet und die reichen offensichtlich nicht für einen Zugang. Aber das spielt für dein Problem keine Rolle, in $mysqli befindet sich ja schon ein mysqli-Objekt mit erfolgreich geöffneter Verbindung, denn du berichtest ja von keiner PHP-Fehlermeldung, die sonst beim Aufruf von $mysqli->query() erschiene.

            Lo!

            1. Also wenn ich das hier einfüge:

              $mysqli->query()

              Kommt:

              Warning:  mysqli::query() expects at least 1 parameter, 0 given in C:\xampp\htdocs\buecher.php on line 101

              Aber inwiefern hilft mir das weiter?

              1. Hi!

                Also wenn ich das hier einfüge:
                $mysqli->query()

                Wieso denn einfügen? Du verwendest das doch bereits zweimal. Untersuche bitte die Rückgabewerte und Variableninhalte deines vorhandenen Codes. Das einzige was du dafür einfügen musst ist var_dump() (natürlich nicht einfach so, sondern mit dem zu untersuchenden Ding als Parameter).

                Lo!

                1. So, ich hab das alles mal ausprobiert.
                  Es werden keine Fehler ausgegeben.

                  Nach mehrmaligen Tests mit unterschiedlichen Daten liegt es auch nicht am Skript - die Daten werden in die Tabelle geschrieben!

                  Es liegt - leider noch mysteriöser - an 2 Spalten.

                  Obwohl diese auf varchar stehen und eigentlich jedes Zeichen zulassen müssten, werden keine Buchstaben in eine Spalte geschrieben. Diese akzeptiert nur Zahlen.
                  Ist ein Buchstabe im Datensatz, wird der gesamte Datensatz nicht eingelesen.

                  Das gilt es jetzt durch Herumprobieren herauszufinden.

                  Aber es liegt zumindest nicht mehr am Skript.

  2. Moin!

    include('database.inc.php');

    Und die hast Du an die neue DB angepasst?

    --
    Vergesst Chuck Norris.
    Sponge Bob kann unter Wasser grillen!
    1. Moin!

      include('database.inc.php');

      Und die hast Du an die neue DB angepasst?

      Ja, statt DB 'book' wurde 'dvd' eingetragen.

      1. Hab auch mal einen Verbindungstest gemacht:

          
        error_reporting(E_ALL);  
          
        define ( 'MYSQL_HOST',      'localhost' );  
        define ( 'MYSQL_BENUTZER',  'root' );  
        define ( 'MYSQL_KENNWORT',  '' );  
        define ( 'MYSQL_DATENBANK', 'dvd' );  
          
        $db_link = mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);  
          
        if ( $db_link )  
        {  
            echo 'Verbindung erfolgreich: ';  
            echo $db_link;  
        }  
        else  
        {  
            die('keine Verbindung möglich: ' . mysql_error());  
        }  
        mysql_close($db_link );
        

        ==> Verbindung erfolgreich: Resource id #5