SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

PHP 5.3 & MySQL 5.1

PHP 5.3 & MySQL 5.1 zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)
Hilfe Community Kalender Heutige Beiträge Suchen

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 07.05.2013, 22:13:45
erselbst erselbst ist offline
Anfänger
 
Registriert seit: Apr 2009
Alter: 52
Beiträge: 11
Verschachtelte Select Abfrage

Hallo, ich möchte von einer Tabelle IPADDR die Anzahl der IP-Adressen (Spalte IPADDR) mit COUNT() ermitteln. In der Tablelle können die IP-Adressen aber mehrmals (max. zweimal) vorkommen. Einmal gibt es die Spalte PORT mit Port 80, das zweite mal (kann, muss aber nicht) mit Port 443. Ich dachte mir, ich werde mit GROUP BY die Spalte IPADDR Gruppieren und davon mit COUNT() die Anzahl ermittlen. Dann bekomme ich aber mehrere Zeilen mit der jeweiligen Anzahl. Wie bekomme ich die Gesammtanzahl der IP-Adressen? Kann das mir jemand sagen?

Code:
SELECT COUNT((SELECT *
FROM `ipaddr`
GROUP BY `ipaddr`))
FROM `ipaddr`
Bei meinem Versuch, bekomme ich die Meldung, dass nur eine Spalte erlaubt ist.
Mit Zitat antworten
  #2  
Alt 12.05.2013, 08:10:27
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Verschachtelte Select Abfrage

Ändere einfach das Konzept:
IP unique/primary key und verwende den SET Typ für die Portspalte.
Dann gibts jede IP nur einmal. Hoffentlich als Integer und nicht als String. ip2long() - vorausgesetzt, Du hast nen 64bit Server - erspart viel Ärger.
Mit Zitat antworten
  #3  
Alt 13.05.2013, 09:35:06
erselbst erselbst ist offline
Anfänger
 
Registriert seit: Apr 2009
Alter: 52
Beiträge: 11
AW: Verschachtelte Select Abfrage

ja ne panimaju :-(
Wie sieht dann die Tabelle in ihrer Struktur dann aus? Geht denn das auch bei MyISAM? Meine Tabelle hat z.Z. diese Struktur:

Code:
CREATE TABLE `ipaddr` (
`id` TINYINT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`ipaddr` VARCHAR( 15 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`port` INT( 4 ) NOT NULL DEFAULT '80'
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
Mit Zitat antworten
  #4  
Alt 13.05.2013, 10:36:42
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Verschachtelte Select Abfrage

Ich meinte es so:

Code:
CREATE TABLE `test` (
  `ipaddr` bigint(20) unsigned NOT NULL,
  `port` set('80','443') NOT NULL DEFAULT '80',
  UNIQUE KEY `ipaddr` (`ipaddr`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Beim Eintragen konvertierst Du mit PHP den IP String ins Integerformat:
int ip2long ( string $ip_address )

ipaddr ist unique. Deshalb wird der Port über den Datentyp SET realisiert.

Hier etwas Futter:
Code:
INSERT INTO `test` (`ipaddr`, `port`) VALUES (3232235777, '80,443');
INSERT INTO `test` (`ipaddr`, `port`) VALUES (3232261121, '80');
Hier das Beispiel für die Umwandlung:
http://mod.php.developer.vc/ip2long/

Code:
SELECT `ipaddr`, `port` FROM `test` WHERE `ipaddr` = 3232235777;
ergibt:
Code:
ipaddr 3232235777 	Port '80,443'
PHP-Code:
echo long2ip(3232235777); 
Problematisch ist allerdings das Integerformat. Bei 64 Bit Systemen klappts ja:
http://mod.php.developer.vc/PHP_INT_MAX/
Bei 32 Bit betrachtet PHP integer nicht als unsigned.

btw: wofür braucht man das?
Mit Zitat antworten
  #5  
Alt 13.05.2013, 17:24:42
erselbst erselbst ist offline
Anfänger
 
Registriert seit: Apr 2009
Alter: 52
Beiträge: 11
AW: Verschachtelte Select Abfrage

Hmm, das funktioniert erstmal so. Muss denn Port vom Type SET sein? Dann kann ich nur vorgegebenen Ports eingeben. Es wäre schön, wenn man die Ports selbst eingeben kann (z.B. 8080). Dann wäre doch besser die Spalte Port vom Type INT(4) zu nehmen. Ist das richtig?

Grr, erst denken, dann posten. Das geht natürlich nicht, wäre ja dann nicht unique bzw könnte nur ein Port zu einer IP-Adresse eingegeben werden.
Mit Zitat antworten
  #6  
Alt 13.05.2013, 19:17:21
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Verschachtelte Select Abfrage

Zitat:
Zitat von erselbst Beitrag anzeigen
Hmm, das funktioniert erstmal so. Muss denn Port vom Type SET sein? Dann kann ich nur vorgegebenen Ports eingeben. Es wäre schön, wenn man die Ports selbst eingeben kann (z.B. 8080). Dann wäre doch besser die Spalte Port vom Type INT(4) zu nehmen. Ist das richtig?
SET ist ein 64 -Bitmaskenfeld.
Zitat:
Grr, erst denken, dann posten. Das geht natürlich nicht, wäre ja dann nicht unique bzw könnte nur ein Port zu einer IP-Adresse eingegeben werden.
Natürlich wäre es möglich, zur Laufzeit die Spalte um weitere Ports zu erweitern.

Teste das einfach mal mit dem PMA (PHPmyAdmin). Der liefert dann auch gleich den SQL String.

Allerdings gibt es ein kleines Problem: die Reihenfolge der Bezeichner darfst Du nicht verändern:
1. Bit hat den Namen '80'
2. Bit hat den Namen '433'
3. Bit hat den Namen '8080'
MySQL trägt in die 8Byte große Spalte dann nur ne 1 oder ne 0 ein.

Und damit Du an die aktuelle Reihenfolge kommst, könntest Du einen Datensatz für die 0.0.0.0 => 0 anlegen, in dem Du alle verfügbaren Bits setzt.
Code:
INSERT INTO `test` (`ipaddr`, `port`) VALUES (0, '80,443');
Bei der Abfrage liefert MySQL nen kommaseparierten String aller gesetzten Bits.
Code:
SELECT port FROM test WHERE ipaddr = 0;
=> '80,443'
Nu soll Port 8080 dazu. In SQL sähe das so aus:
Code:
ALTER TABLE `test` CHANGE `port` `port` SET( '80', '443', '8080' )  NOT NULL DEFAULT '80';
Wie Du den ALTER TABLE String basteln könntest, kannste Dir da mal angucken:
http://mod.php.developer.vc/set-1/ (Quelltext wird angezeigt)
Mit Zitat antworten
  #7  
Alt 13.05.2013, 22:18:28
erselbst erselbst ist offline
Anfänger
 
Registriert seit: Apr 2009
Alter: 52
Beiträge: 11
AW: Verschachtelte Select Abfrage

DISTINCT ist genau was ich gesucht habe ;) Die Folgende Abfrage liefert mir das Ergebnis welches ich benötige.

Code:
SELECT COUNT(DISTINCT `ipaddr`) AS `count` FROM `ipaddr`
Trotzdem vielen Dank für die ausführlichen Antworten und Wege, wie man auf die Lösung kommt.
Mit Zitat antworten
  #8  
Alt 14.05.2013, 02:12:40
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Verschachtelte Select Abfrage

Zitat:
Zitat von erselbst Beitrag anzeigen
DISTINCT ist genau was ich gesucht habe ;)
Oder so.

Wofür brauchst Du das denn eigentlich? IP sind ne endliche Menge an Integerzahlen (paar Netze 0.x, 10.x 127.x 192.168.x usw.fallen noch weg). Zudem leben wir in einem Ländle, in dem die wenigsten Surfer über eine feste IP verfügen. Und ein Teil davon surft böswilligerweise über Proxies.

Warste unartig und mußt jetzt Logfiles parsen? <ggg>
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Ausgabe wird nicht angezeigt Extremefall PHP Grundlagen 9 17.12.2009 08:49:45
verschachtelte abfrage dauert ewig olz MySQLi/PDO/(MySQL) 0 01.05.2009 15:46:35
SELECT Abfrage nur mit gefüllten Werten Skyman MySQLi/PDO/(MySQL) 0 24.10.2007 23:01:50
Verschachtelte Abfrage Zudecke MySQLi/PDO/(MySQL) 3 09.12.2005 14:20:25
select feld mit if abfrage? Silencer PHP für Fortgeschrittene und Experten 3 20.11.2002 09:34:59


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:53:19 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt