Expert PHP and MySQL®

Published byWiley Publishing, Inc.10475 Crosspoint BoulevardIndianapolis, IN 46256www.wiley.com

Copyright © 2010 by Wiley Publishing, Inc., Indianapolis, Indiana

Published simultaneously in Canada

ISBN: 978-0-470-56312-0

Manufactured in the United States of America

10 9 8 7 6 5 4 3 2 1

No part of this publication may be reproduced, stored in a retrieval system or transmitted in any form or by any means, electronic, mechanical, photocopying, recording, scanning or otherwise, except as permitted under Sections 107 or 108 of the 1976 United States Copyright Act, without either the prior written permission of the Publisher, or authorization through payment of the appropriate per-copy fee to the Copyright Clearance Center, 222 Rosewood Drive, Danvers, MA 01923, (978) 750-8400, fax (978) 646-8600. Requests to the Publisher for permission should be addressed to the Permissions Department, John Wiley & Sons, Inc., 111 River Street, Hoboken, NJ 07030, (201) 748-6011, fax (201) 748-6008, or online at http://www.wiley.com/go/permissions.

Limit of Liability/Disclaimer of Warranty: The publisher and the author make no representations or warranties with respect to the accuracy or completeness of the contents of this work and specifically disclaim all warranties, including without limitation warranties of fitness for a particular purpose. No warranty may be created or extended by sales or promotional materials. The advice and strategies contained herein may not be suitable for every situation. This work is sold with the understanding that the publisher is not engaged in rendering legal, accounting, or other professional services. If professional assistance is required, the services of a competent professional person should be sought. Neither the publisher nor the author shall be liable for damages arising herefrom. The fact that an organization or Web site is referred to in this work as a citation and/or a potential source of further information does not mean that the author or the publisher endorses the information the organization or Web site may provide or recommendations it may make. Further, readers should be aware that Internet Web sites listed in this work may have changed or disappeared between when this work was written and when it is read.

For general information on our other products and services please contact our Customer Care Department within the United States at (877) 762-2974, outside the United States at (317) 572-3993 or fax (317) 572-4002.

Wiley also publishes its books in a variety of electronic formats. Some content that appears in print may not be available in electronic books.

Library of Congress Control Number: 2010920658

Trademarks: Wiley, the Wiley logo, Wrox, the Wrox logo, Wrox Programmer to Programmer, and related trade dress are trademarks or registered trademarks of John Wiley & Sons, Inc. and/or its affiliates, in the United States and other countries, and may not be used without written permission. MySQL is a registered trademark of MySQL AB. All other trademarks are the property of their respective owners. Wiley Publishing, Inc., is not associated with any product or vendor mentioned in this book.

This book is dedicated to my wife, Laura. Without your support this book wouldn’t be possible. Thank you for being by my side and planning the wedding while I was doing my writing!

—Andrew Curioso

For MySQL Culture, past, present, and future. To many in the MySQL community: you are more than colleagues, you are great friends.

—Ronald Bradford

This book is dedicated to my son, Kiran Patrick. “Kiran” means “ray of light” in Sanskrit, and you are a ray of light in my life!

—Patrick Galbraith

About the Authors

ANDREW CURIOSO has been coding in PHP and MySQL for a decade. His experience includes developing professional-grade PHP and MySQL based web applications for MIT Lincoln Laboratory (part of the Massachusetts Institute of Technology) and being at the ground floor of the state-of-the-art web-publishing platform Webon at Lycos (currently the page builder technology for Angelfire.com). Aside from software engineering, Andrew takes interest in software usability, business, the semantic web, and robotics. He currently works at MyVBO, a virtual business office that provides powerful tools to help small to medium sized business manage their companies online. Over the years, he’s had the opportunity to work on exciting projects and specializes in data portability, linked data, social media, and Rich Internet Applications. His home on the web can be found at http://andrewcurioso.com/.

RONALD BRADFORD has more than two decades of professional IT industry experience in a broad range of disciplines. His core expertise is in relational database management systems (RDBMS) including MySQL, Oracle and Ingres. His technical software development skills include working in Java (J2EE), PHP, Perl, Python, Web (HTML/CSS/XML/JSON), and Linux/Unix operating systems. He is a professional speaker, educational curriculum developer, and writer who specializes in technical presentations, workshops, online content publishing, and knowledge transfer. More information on his related MySQL writings, presentations and useful tools can be found at http://ronaldbradford.com.

PATRICK GALBRAITH lives up in the sticks of southwestern New Hampshire near Mt. Monadnock with his wife Ruth and son Kiran. Since 1993, he has been using and developing Open Source software. He has worked on various Open Source projects including MySQL, federated storage engine, memcached Functions for MySQL, Drizzle, Narada Search Engine Slashcode, and is the maintainer of DBD::mysql. He has worked at a number of companies throughout his career, including MySQL AB, Classmates.com, OSDN/Slashdot, and Lycos. He currently works at NorthScale, a leading provider of scale-out infrastructure software for web applications. He is also part owner of a wireless broadband company, Radius North, which provides Internet service to underserved rural areas of New Hampshire. His website, which comes by way of a 5.8GHz Alvarion access unit up in a pine tree, is http://patg.net.

About the Technical Editors

ALAN COLLISON is a software engineer with more than a dozen years of experience developing scalable PHP applications. His expertise ranges from the design and development of front end GUIs to the implementation of core server side application business logic.

JAY COSKEY is a software developer and software development manager who lives in Seattle, and has worked for companies including Cray Inc. and Amazon.com. He has used numerous languages on Linux, Unix, and Windows platforms, in environments ranging from OS development, to web and enterprise systems. When not involved in mathematics or software, he can sometimes be found woodworking.

ERIC DAY has been writing high-performance servers and databases for most of his career and currently works on open source projects such as Drizzle and Gearman. He has also written a number of extensions for higher level languages such as PHP. When not hacking on code, he can be found running, enjoying a good vegan meal, or blogging at http://oddments.org/.

KEN MACKE is a systems architect, developer, and owner of RockIP Networks — a provider of web hosting and IT consulting services. Ken has over 15 years of experience creating cutting-edge software with technologies such as PHP, C++, C#, and .NET. You can find Ken online at twitter.com/kmacke.

ELIZABETH NARAMORE has been a web developer since 1997, with a focus in PHP and E-commerce. In addition to being a web developer, she is an author, editor, speaker, and educator, and active member of communities such as the PHP Community, PHPWomen, and her local PHP Users Group.

TROND NORBYE is a Senior Software Engineer specializing in databases and distributed caching. He currently works at NorthScale designing and implementing scale out data systems. Prior to joining NorthScale, Trond was a key member of Sun Microsystems’ Web Scale Infrastructure group where he worked on Drizzle, Gearman and Memcached. In his copious free time he is a core contributor on the Memcached, Libmemcached and OpenGrok Open Source projects.

KARL WILBUR is an enterprise consultant, PHP developer and Linux guru with more than a decade of LAMP experience and a passion for the bleeding-edge. When not out motorcycling the Midwest he can be found lurking on the Internet at http://karlwilbur.net/.

Credits

Executive Editor

Robert Elliott

Project Editor

Maureen Spears

Technical Editors

Alan Collison

Jay Coskey

Eric Day

Ken Macke

Elizabeth Naramore

Trond Norbye

Karl Wilbur

Production Editor

Eric Charbonneau

Copy Editor

Kim Cofer

Editorial Director

Robyn B. Siesky

Editorial Manager

Mary Beth Wakefield

Marketing Manager

Ashley Zurcher

Production Manager

Tim Tate

Vice President and Executive Group Publisher

Richard Swadley

Vice President and Executive Publisher

Barry Pruett

Associate Publisher

Jim Minatel

Project Coordinator, Cover

Lynsey Stanford

Compositor

Jeff Lytle, Happenstance Type-o-Rama

Proofreader

Nancy Bell

Indexer

Johnna VanHoose Dinse

Cover Designer

Michael E. Trent

Cover Image

©Gavin Hellier/Photographer’s Choice RF/Getty Images

Acknowledgments

IT WAS THANKS TO MY BROTHER RAY CURIOSO JR. that I was really able to get a head start. He started an embroidery business in the 90s out of my parents’ garage. It has since moved to its own place but there was that time in-between where, thanks to his company, I was one of the only people that I knew with Internet access. It was slow and it took days to download software development kits and it wasn’t as easy to find programming help for a beginner as it is today. But I made do with what I had. It was also because of him and his business — it needed an ecommerce site — that I put down the C code and the ASP and got my start with PHP and MySQL.

I’d like to thank my parents too for being a constant source of support for me. It was my father who taught me the value of hard work. And, of course, thank my wife who put up with me spending long nights working for a start up and writing a book at the same time. We were married during the writing and without her hard work planning the wedding, supporting me, and standing by my side this book would not have been possible.

I’d like to thank my teammates at Lycos. It was truly a pleasure working with each of them. I’d particularly like to thank my managers. Don Kosak for inspiring me, Neal Shanske for keeping me on my toes. I’d like to thank Derek Bruneau since everything I learned about good software design and usability I learned thanks to him. And I’d like to thank my fellow engineers Lisa Wallmark, Chandra Yadav, and Kevin Harrington. I’d like to also thank my team at MyVBO, in particular Robert (Bob) Wilkins and Matthew Sheppard for their understanding as I juggled work and writing.

Finally, I would also like to take a minute to thank the team that worked tirelessly to make this book happen. Bob Elliott who made this book happen, Maureen Spears who edited this whole thing cover to cover, and my co-authors Patrick and Ronald. Patrick in particular has been a good friend and deserves credit for putting the team together. He is the one thread that connects us all. Which brings me to the tech editors. They all did an amazing job and the book is much better because of each of them.

There are countless people who have helped me along the way. I am sure that I forgot someone. To anyone who has ever encouraged me to follow my dreams or supported me in any way: thank you.

—Andrew Curioso

TODAY, I AM A WELL RESPECTED AUTHORITY in the MySQL field. This was not possible without a lot of hard work and great mentorship. I would first like to thank the late Frank Jarvis from DDIAE (now USQ) who in 1988 introduced me to the works of C.J. Date, M. Stonebraker and E.F. Codd during my university studies.

My first relational database experience started with Ingres and led to immediate work with systems design and software development in the database field. In the early 90’s, as a young, energetic and knowledgeable database architect with several successful government projects, my work alongside my now good friend Bruce Turner helped in my understanding and appreciation of more formal processes in the management and success of large scale deployments. We worked together again for Oracle Corporation in the late 90s where Bruce still works today. To Bruce, thank you for your support and mentoring. Those TAFE days with Mike and Laurie still rate as some of my favorites. From my first use of MySQL over ten years ago until today I still seek input, advice and encouragement from the MySQL community. Many of you from the MySQL community I consider as great friends.

Finally, to my fiance Cindy who has been supportive throughout the entire process of my first book in MySQL with compromises that have enabled me to complete this work on schedule.

—Ronald Bradford

ONE WEEKEND IN 1993, I had the chance to go on a getaway to San Diego. Instead, I opted to stay home and download, onto 26 floppies, Slackware Linux, which I promptly installed onto my Packard Bell 386. I could never get the built-in video card to work with X, so I ended up buying a separate video card and had to edit my XConfig file to get it to work. How much more interesting this was to do than editing a config.sys and an autoexec.bat! From then on, I was hooked. I worked at Siemens Ultrasound Group in Issaquah, Washington, at the time. An engineer there named Debra, when asked what was a good thing to learn, said something I’ll never forget: ‘‘Learn Perl.’’ Debra — you were right! I always wanted to be a C ++ graphics programmer. That didn’t happen because of this thing called the World Wide Web. I remember Ray Jones and Randy Bentson of Celestial Software showing me a program called Mosaic, which allowed you to view text over the Internet. Images would be launched using XV. Everywhere I worked, I had to write programs that ran on the Web, which required me to write CGI in Perl. So much for my goal of being a C ++ programmer — but I consider this a great trade for a great career. (I did eventually get to write C ++ for MySQL!) I would first like to thank my wife, Ruth, for being patient and supportive of me for numerous lost weekends with this book and my previous book Developing Web Applications with Perl, memcached, MySQL and Apache, as well as accepting me working on yet another book so soon after the first! Next in line for thanks, our editor, Maureen Spears, who is not only a great editor, but also a friend. Not only did she edit this current work, but she was my editor for my previous book. Next, I would like to thank my co-authors, Andrew and Ronald. It’s been a whole different experience co-authoring versus being a sole author, having learned a bit about putting together something — as a team.

A special thanks goes to our tech editors as well as to Trond Norbye (memcached, libmemcached), Eric Day (Gearman, Drizzle) and Andrew Aksyonoff (Sphinx) for stepping up as tech editors when we were in a crunch and reviewing the material I wrote about their projects!

Thank you to Bob Elliott, who gave us the opportunity to work as a team to write this book! Thanks to Monty Widenius for creating MySQL and for being a mentor as well as a good friend who worked hard to include FederatedX into MariaDB while I was working on this book. Thanks also to Brian Aker for being another great mentor and friend, as well as being a software-producing machine with a scrolling page full of open source software projects that he’s created, including Drizzle and libmemcached.

I WOULD LIKE TO THANK MY CURRENT COLLEAGUES at Northscale — Steve Yen, Dustin Sallings, James Phillips, Matt Ingenthron, Rod Ebrahimi, Eric Lambert and Trond Norbye — it’s a real privilege to work with guys who have so much expertise. Also thanks go to my former colleagues at Lycos who encouraged me while writing my previous book — Don Kosak, Chandra Yadav, Tristan Escalada, others, as well as Andrew Curioso! Also to former colleagues at Grazr and MySQL. Last but not least, thanks to the team members of MariaDB and Drizzle for integrating projecs I worked on while writing this book. Thanks also to anyone I forgot to mention. I know I probably forgot someone!

—Patrick Galbraith

Introduction

PHP AND MYSQL HAVE BEEN USED FOR YEARS to power some of the most popular websites and open source applications anywhere. It’s no secret that the Web has evolved. Modern web sites are expected to be dynamic and the user count for popular sites is now measured in the millions.

This book examines some of the technologies and techniques needed to make robust and scalable applications perform in today’s high-demand world. Early chapters focus on essential concepts. For example:

Object Oriented Programming

Design Patterns

Advanced MySQL queries

Later chapters get down into the trenches and focus on ways to improve application performance through caching with memcached (and others), full-text search with Sphinx, and multitasking with Gearman.

Today’s PHP programmer can’t be afraid to get their hands dirty. By the time this book is done you will be well on your way to extending PHP and MySQL using C. In PHP we cover extension writing. In MySQL we cover User Defined Functions.

The book focuses on critical skills and best practices in the areas of security, optimization, and software architecture. The examples are written with the assumption that you already know the basics so common code is occasionally stripped out to make the examples more readable and focused. And as such you will see examples in the book that don’t check the return value of a function for errors. Don’t put code like that onto your live server; fix it first! You know how.

This book will give you the tools that you need to write mission critical applications with PHP and MySQL — including high-traffic ones. The hope is that you can use some of the skills covered in this book to create your own open source projects and eventually contribute to the PHP and MySQL communities. Or perhaps you just use this book to help you create the next PHP and MySQL powered success story

Who This Book Is For

This book is designed to cover some of the most advanced topics in the PHP and MySQL worlds. It is intended for advanced PHP and MySQL users who have significant experience and have already worked on several projects. Some people who should read this book include:

Programmers creating mission-critical applications

Programmers creating websites or applications that need to support thousands (if not millions) of users

Programmers who create applications that need to store and access large amounts of data or requires lots of processing

Programmers who just find things like design patterns, PHP extensions, and MySQL UDFs interesting and who want to learn more

This book assumes that you also have a working knowledge of C as well and that you have at least compiled a C programmer or two (PHP and MySQL count). PHP extensions and MySQL User Defined Functions are both written in C.

This book starts off easy but quickly dives into many advanced topics. It’s all right if you’re not already an advanced PHP, MySQL, and C programmer but you’ll probably want to keep some other Wrox books handy for reference.

What This Book Covers

PHP and MySQL are both well established with many libraries and extensions available. It would be impossible to cover every expert topic in a single book. Likewise, this book doesn’t try to cover beginner level topics at all. The authors did, however, hand pick topics that they think are essential for any expert PHP and MySQL programmer to know.

The book is laid out like this:

Chapters 1 through 3 are intended as a crash course in concepts that you absolutely must know before reading the rest of the book. They cover topics like design patters, iterators, and the difference between the MySQL storage engines.

Chapters 4 and 5 take a brief break from the essentials and focuses on one of the most important concepts for creating scalable applications: caching.

Chapter 6 revisits the essentials and touches on some advanced MySQL topics.

Chapters 7 and 8 dive into extending PHP and MySQL with C. They are the only chapters in the book where you’re not writing code in just PHP or SQL.

Chapter 9 goes over full-text search and introduces Sphinx.

Chapter 10 covers multitasking and discusses Gearman.

Chapters 11 and 12 cover essentials including advanced rewrite rules, custom session handling and user security.

Chapter 13 goes over MySQL INFORMATION_SCHEMA.

Chapter 14 touches on security some more.

Chapters 15 and 16 wrap up the book with other uses of PHP and MySQL besides web applications and optimizing and debugging.

What You Need to Use This Book

Apart from a willingness to learn and all the skills listed in “Whom This Book Is For” you will also need:

PHP 5.3 or newer with MySQL and MySQLi enabled. Preferably compiled from source (for Chapter 8). However, some examples will run in older versions as well.

MySQL 5.1 or higher. You can also substitute MariaDB or Drizzle for most examples.

Apache 2.0 web server configured for PHP with mod_rewrite enabled.

Using Linux

If you are using Linux for your PHP and MYSQL development (highly recommended):

An ANSI C compiler (Ex: GCC) to compile PHP extensions and MySQL User Defined Functions

flex: Version 2.5.4

bison: Version 1.28 (preferred), 1.35, or 1.75

Using Windows

If you are using Windows you will need:

Microsoft Visual Studio 2008 or newer

Windows SDK 6.1

You can also substitute Microsoft IIS in place of Apache. However, some of the content in this book is Apache specific.

Conventions

To help you get the most from the text and keep track of what’s happening, we’ve used a number of conventions throughout the book.

Boxes like this one hold important, not-to-be forgotten information that is directly relevant to the surrounding text.

Tips, hints, tricks, and asides to the current discussion look like this.

As for other conventions in the text:

New terms and important words are highlighted in italics when first introduced.

Keyboard combinations are treated like this: Ctrl+R.

Filenames, URLs, and code within the text are treated like so: persistence.properties.

This book uses monofont type with no highlighting for most code examples.

This book uses bolding to emphasize code that is of particular importance in the present context.

Source Code

As you work through the examples in this book, you may choose either to type in all the code manually or to use the source-code files that accompany the book. All of the source code used in this book is available for download at www.wrox.com. Once at the site, simply locate the book’s title (either by using the Search box or by using one of the title lists) and click the Download Code link on the book’s detail page to obtain all the source code for the book.

Because many books have similar titles, you may find it easiest to search by ISBN; this book’s ISBN is 978-0-470-56312-0.

Once you download the code, just decompress it with your favorite compression tool. Alternately, you can go to the main Wrox code download page at www.wrox.com/dynamic/books/download.aspx to see the code available for this book and all other Wrox books.

Errata

We make every effort to ensure that there are no errors in the text or in the code. However, no one is perfect, and mistakes do occur. If you find an error in one of our books, like a spelling mistake or faulty piece of code, we would be very grateful for your feedback. By sending in errata, you may save another reader hours of frustration, and at the same time you will be helping us provide even higher-quality information.

To find the errata page for this book, go to www.wrox.com and locate the title using the Search box or one of the title lists. Then, on the book details page, click the Book Errata link. On this page you can view all errata that have been submitted for this book and posted by Wrox editors. A complete book list, including links to each book’s errata, is also available at www.wrox.com/misc-pages/booklist.shtml.

If you don’t spot “your” error on the Book Errata page, go to www.wrox.com/contact/techsupport.shtml and complete the form there to send us the error you have found. We’ll check the information and, if appropriate, post a message to the book’s errata page and fix the problem in subsequent editions of the book.

p2p.wrox.com

For author and peer discussion, join the P2P forums at p2p.wrox.com. The forums are a web-based system on which you can post messages relating to Wrox books and related technologies and interact with other readers and technology users. The forums offer a subscription feature to e-mail you topics of interest of your choosing when new posts are made to the forums. Wrox authors, editors, other industry experts, and your fellow readers are present on these forums.

At http://p2p.wrox.com you will find a number of different forums that will help you not only as you read this book, but also as you develop your own applications. To join the forums, just follow these steps:

1. Go to p2p.wrox.com and click the Register link.

2. Read the terms of use and click Agree.

3. Complete the required information to join as well as any optional information you wish to provide, and click Submit.

4. You will receive an e-mail with information describing how to verify your account and complete the joining process.

You can read messages in the forums without joining P2P, but in order to post your own messages, you must join.

Once you join, you can post new messages and respond to messages other users post. You can read messages at any time on the Web. If you would like to have new messages from a particular forum e-mailed to you, click the Subscribe to this Forum icon by the forum name in the forum listing.

For more information about how to use the Wrox P2P, be sure to read the P2P FAQs for answers to questions about how the forum software works, as well as many common questions specific to P2P and Wrox books. To read the FAQs, click the FAQ link on any P2P page.

Chapter 1: Techniques Every Expert Programmer Needs to Know

What’s in This Chapter?

Understanding Object-oriented fundamentals in PHP

Understanding INNER and OUTER JOINs

Other JOIN syntax you should know

Using MySQL Unions

Using GROUP BY in MySQL queries

Implementing MySQL Logical Operations and flow control

Maintaining MySQL relational integrity

Using subqueries in MySQL

Utilizing advanced PHP regular expressions

This chapter covers the techniques that you, the proficient PHP and MySQL developer, should know and use before you tackle more advanced domain features in PHP and MySQL. The chapter starts with an in-depth overview of object-oriented programming techniques in PHP and object-oriented design patterns. As a PHP developer, you then become familiar with a number of core MySQL requirements for retrieving data including the different types of joins, UNION, GROUP BY, and subqueries syntax. This chapter also details the logic operators and flow control and techniques for maintaining relational integrity in MySQL. The chapter concludes with an in-depth review of advanced regular expressions in both PHP and MySQL.

OBJECT-ORIENTED PHP

Object-orientation has become a key concept behind proper PHP software design. This book follows the idea that in properly designed software, all business logic (the rules that drive how an application behaves) should be object oriented. The only exception is when small scripts act as a view or a way to display data returned from other objects.

Taking this approach solves a few problems because it:

Makes it easy to extend the functionality of existing code.

Allows for type hinting, which gives greater control over what variables are passed into functions.

Allows for established design patterns to be used to solve common software design problems and makes debugging much easier.

This section covers object-oriented PHP and key design patterns in depth. Later chapters cover even more advanced object-oriented topics.

Instantiation and Polymorphism

The two key benefits of object-oriented programming in PHP are the ability to abstract data into classes and for the application to act on those structures. It is important to understand polymorphism, which is when one object appears and can be used in the same way as another object of a related type. It stands to reason that if B is a descendant of A and a function can accept A as a parameter, it can also accept B.

Three classes are used in this chapter while covering polymorphism:

Node

BlogEntry

ForumTopic

In this application both BlogEntry and ForumTopic are siblings of each other and descendants of Node. This is a good time to become familiar with the example code that comes with the book. The code archive contains a folder for every chapter. Each folder has a .class.php file and a .test.php file for every class. SQL files aren’t used in this section, but when they are, they have a .sql extension.

The typical class looks a lot like this:

class ClassNameHere extends AnotherClass{

public function someFunction(){

parent::someFunction();

}

};

The parent keyword is used to directly reference a variable or method in the parent class, bypassing any variables or methods of the same name in the current class. The method is marked as public, which is a familiar concept for object-oriented programming but relatively new to PHP. Older PHP applications will not define a visibility for the member methods. When the visibility is not defined it is assumed to be public. A member variable or method (function inside a class) can have one of three visibilities:

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!