Bitte um Hilfe bei MySQLi


#1
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);
 

basti1012

Erfahrenes Mitglied
#2
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
 
#3
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
 

basti1012

Erfahrenes Mitglied
#4
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
 
#6
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>";
}
 

basti1012

Erfahrenes Mitglied
#9
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 .
 

merzi86

Erfahrenes Mitglied
#10
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.
 

ComFreek

Mod | @comfreek
Moderator
#11
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.
Abgesehen davon geht das auch kaputt, wenn die Nutzereingaben z. B. Single Quotes (') enthalten. Das ist bei Textfeldern gar nicht so unüblich, sprich, selbst wenn man Angreifer 100% ignorieren würde (was eine sehr schlechte Entscheidung ist), würden manche Nutzer über Fehler klagen, wenn sie aus ihrer Sicht normale Texte eingeben.
 

Neue Beiträge