Bitte um Hilfe bei MySQLi

Christian62

Grünschnabel
Dieses Script lief unter PHP5 und MySQL einwandfrei. Mein Server wurde umgestellt auf PHP7 und MySQLi.
Vieles konnte ich selbst schon umschreiben und so retten, aber bei diesem Scriptteil hänge ich und hoffe ihr könnt mit helfen umzuschreiben auf MySQLi

Ich bedanke mich im Voraus

PHP:
// Connect to database
    $link_id = mysql_connect($dbhost, $dbuser, $dbpass) or die("<p>Error connecting to the database server!</p>\n");
    mysql_select_db($dbname, $link_id);
    
    mysql_query("DROP TABLE IF EXISTS $dbtable", $link_id) or die(mysql_error());
    mysql_query("CREATE TABLE $dbtable (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, ipstart INT(10) UNSIGNED NOT NULL, ipend INT(10) UNSIGNED NOT NULL, ccode CHAR(2) NOT NULL, INDEX searchindex(ipstart, ipend))", $link_id) or die(mysql_error());
    
    echo "<p>Daten in die Datenbank schreiben...";
    flush();
    $rows = explode("\n", $data);
    $count = 0;
    foreach($rows as $row) {
        $row = str_replace('"','',trim($row));
        if(!$row) continue;
        $cells   = explode($delimiter, $row);
        $startip      = $cells[$startip_colnum];
        $endeip       = $cells[$endeip_colnum];
        $ipstart      = $cells[$ipstart_colnum];
        $ipend        = $cells[$ipend_colnum];
        $ccode        = $cells[$ccode_colnum];
        $countryname  = mysql_real_escape_string($cells[$countryname_colnum]);
        $sql = "INSERT into $dbtable (Start_IP, Ende_IP, ipstart, ipend, ccode, Country_Name) VALUES('$startip', '$endeip', '$ipstart', '$ipend', '$ccode', '$countryname')";
        mysql_query($sql, $link_id) or die("Error on query \"" . $sql . "\" - " . mysql_error());
        $count++;
    }
    mysql_close($link_id);
 
Als erstest mußt du alles was mysql hat in mysqli ändern weil php 7 unterstützt mysql nicht mehr.
Bei den meisten sachen reicht es einfach ein i dazu zu schreiben . Bei einigen sachen muß man noch einen 2te parameter ( meistens die connect Daten ) mit übergeben.
Ich kann das schlecht erklären,aber erstmal muß überall ein i mit rein und php und sql sagen dirdann schon wo man noch was ändern muß.
Alsodas mysql auf mysqli ändern ist eigentlich kein großes problem
 
Als erstest mußt du alles was mysql hat in mysqli ändern weil php 7 unterstützt mysql nicht mehr.
Bei den meisten sachen reicht es einfach ein i dazu zu schreiben . Bei einigen sachen muß man noch einen 2te parameter ( meistens die connect Daten ) mit übergeben.
Ich kann das schlecht erklären,aber erstmal muß überall ein i mit rein und php und sql sagen dirdann schon wo man noch was ändern muß.
Alsodas mysql auf mysqli ändern ist eigentlich kein großes problem
Das war schon mein erster Versuch, der eigentlich nicht geholfen hat. Die Seite meldete Error 500
 
Ist das alles an Code da oben den du gepostet hast ? Oder gehöhrt da noch mehr zu ? Dann kucke ich später mal wenn sich bis dahin kein anderer gemeldet hat und ändere das für mysqli
 
Danke an Basti, mit seiner Hilfe funktioniert es jetzt
PHP:
$mysqli = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
   if (mysqli_connect_errno())      die ("Connect failed: " . mysqli_connect_error($mysqli));     
   mysqli_set_charset($mysqli, "utf8");

    $query='DROP TABLE IF EXISTS $dbtable';
    $result=mysqli_query($mysqli,$query) or die(mysqli_error());
    if($result){
           echo "<p>Tabelle $dbtable nicht vorhanden<br>";
                      
         $query2="CREATE TABLE IF NOT EXISTS `$dbtable` (
          `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT PRIMARY KEY ,
          `Start_IP` varchar(15) DEFAULT NULL,
          `Ende_IP` varchar(15) DEFAULT NULL,
          `ipstart` int(10) UNSIGNED NOT NULL,
          `ipend` int(10) UNSIGNED NOT NULL,
          `ccode` char(2) NOT NULL,
          `Country_Name` char(44) NOT NULL,
          INDEX searchindex(ipstart, ipend))
          ENGINE=MyISAM DEFAULT CHARSET=utf8;";     
 
         $result2=mysqli_query($mysqli,$query2) or die ("MySQL-Error: " . mysqli_error($mysqli));
         if($result2)
          {
             echo "Tabelle $dbtable erstellt<br>";

    echo "Daten in die Datenbank schreiben...<br>";
    flush();
    $rows = explode("\n", $data);
    $count = 0;
    foreach($rows as $row) {
        $row = str_replace('"','',trim($row));
        if(!$row) continue;
        $cells   = explode($delimiter, $row);
        $startip      = $cells[$startip_colnum];
        $endeip       = $cells[$endeip_colnum];
        $ipstart      = $cells[$ipstart_colnum];
        $ipend        = $cells[$ipend_colnum];
        $ccode        = $cells[$ccode_colnum];
        $countryname  = $cells[$countryname_colnum];
        
        $query3 = "INSERT into $dbtable (Start_IP, Ende_IP, ipstart, ipend, ccode, Country_Name) VALUES('$startip', '$endeip', '$ipstart', '$ipend', '$ccode', '$countryname')";
        $result3=mysqli_query($mysqli,$query3) or die("Error on query " . mysqli_error($mysqli));
        $count++;
        if($result3){
                echo "Daten $x gespeichert<br>";
        }else{
               echo "Daten $x nicht gespeichert<br>";       
        }
     }
    mysqli_close($mysqli);
    echo "FERTIG";
}else{
echo "<p>Tabelle erstellen fehlgeschlagen</p>";
}
}else{
    echo "<p>Datenbank gibt es schon</p>";
}
 
Zb
PHP:
$countryname=mysqli_real_escape_string($mysqli, $cells[$countryname_colnum]);

Mir wurde immer gesagt , was in der Datenbank rein geht ( INSERT, UPDATE ) und auch WHERE sollte man das escapen.
Nur leider list man so oft auch andere sachen das man da gar nicht weiß wer recht hat .
 
Mir wurde immer gesagt , was in der Datenbank rein geht ( INSERT, UPDATE ) und auch WHERE sollte man das escapen.
Nur leider list man so oft auch andere sachen das man da gar nicht weiß wer recht hat .

Nutzereingaben, die zum Aufbau eines SQL-Queries genutzt werden, zu Escapen ist generell nie ein Fehler.
Mittlerweile gibt es allerdings Moderne Möglichkeiten, welche das Escapen überflüssig machen.

Eine der Maßnahme ist ist das richtige verwenden von Prepared-Statements.

Als Beispiel nehme ich das z.B. mal die Beispiele von PHP.net siehe hier.

Die richtige Verwendung wäre:
PHP:
/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"))) {
     echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

/* Prepared statement, stage 2: bind and execute */
if (!$stmt->bind_param("i", $_POST['id'])) {
    echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}

Ein Beispiel für eine falsche Verwendung wäre z.B. so:
PHP:
/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES ($_POST['id'])"))) {
     echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}

Beide Beispiele würden zwar bei einer korrekten Eingabe ordentlich arbeiten, allerdings bietet das 2. Beispiel die Sicherheitslücke, dass ein Angreifer eine SQL-Injection fahren kann.
 
Zurück