[PHP] MySQLi problem

10/06/2014 10:23 XxharCs#1
Hey,
I'm having a problem in PHP with mysqli. I'm working under Ubuntu 14.04.
I need to fill a table with data of a DB.

This is how the DB is created:
Code:
DROP DATABASE IF EXISTS premiere;
CREATE DATABASE premiere;
USE premiere;

-- DROP TABLE IF EXISTS sender;
CREATE TABLE sender (
        sname   VARCHAR(255),
        logo    VARCHAR(255),
        PRIMARY KEY (sname)
) ENGINE = INNODB;

INSERT INTO sender VALUES ('13TH STREET', NULL);
INSERT INTO sender VALUES ('MGM', NULL);
INSERT INTO sender VALUES ('PREMIERE 1', NULL);
INSERT INTO sender VALUES ('PREMIERE 2', NULL);
INSERT INTO sender VALUES ('PREMIERE 3', NULL);
INSERT INTO sender VALUES ('PREMIERE 4', NULL);
INSERT INTO sender VALUES ('PREMIERE FILMCLASSICS', NULL);
INSERT INTO sender VALUES ('PREMIERE FILMFEST', NULL);
INSERT INTO sender VALUES ('PREMIERE KRIMI', NULL);
INSERT INTO sender VALUES ('PREMIERE NOSTALGIE', NULL);
INSERT INTO sender VALUES ('PREMIERE SERIE', NULL);
INSERT INTO sender VALUES ('PREMIERE START', NULL);
INSERT INTO sender VALUES ('SCI FI', NULL);
And this is my PHP code.
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
	<head>
		<title>channels.php</title>
	</head>
	
	<body>
		
		<h1 style="font-size: 30px;">Channels</h1>
		

		<table style="font-size: 15px;" border="1">
				
			<tr>
				
				<th><a href="channels.php?order=1&dir=<?php if($_GET['dir'] == 'ASC'){ $_GET['dir'] = 'DESC';}else{ $_GET['dir'] = 'ASC';} echo $_GET['dir'];?>">Sendername</a></th>
				
				<th><a href="channels.php?order=2&dir=<?php if($_GET['dir'] == 'ASC'){ $_GET['dir'] = 'DESC';}else{ $_GET['dir'] = 'ASC';} echo $_GET['dir'];?>">Logo</a></th>
				
				
			</tr>
			
			<?php
			$db = new mysqli('localhost', 'username', 'password', 'premiere');
			
			if(isset($_GET['order']) && isset($_GET['dir']))
			{
				if($_GET['order'] == '1')
				{
						$sql = 'SELECT * FROM sender ORDER BY sname '.$_GET['dir'].' FOR UPDATE;';
				}elseif($_GET['order'] == '2')
				{
						$sql = 'SELECT * FROM sender ORDER BY logo '.$_GET['dir'].' FOR UPDATE;';
				}
			}else
			{
				$sql = 'SELECT * FROM sender FOR UPDATE;';
			}
				
				
			$stmt = $db->prepare($sql);
			$stmt->execute();
			$stmt->bind_result($senderName, $logo);

			while($stmt->fetch())
			{
				echo '<tr>';
				echo '<td>'.$senderName.'</td>';
				echo '<td>'.$logo.'</td>';
				echo '</tr>';
			}
			$stmt->close();
			?>
				
		</table>
	</body>
</html>
But somehow it doesn't work, I don't know why, i could just figure it out that after execute() the php-script crashes because nothing gets displayed out, I also tried echos after $stmt->execute(); but nothing gets printed out, thats why I think that the php-script crashes.

I hope you can help me.
10/06/2014 12:51 _robox#2
Habe zwar schon langer nicht mehr mit mysqli gearbeitet da ich PDO vorziehe.
Aber Soweit ich weise müssen alle spalten in der SELECT Anweisung benannt werden

false
PHP Code:
$sql 'SELECT * FROM sender FOR UPDATE;'
true
PHP Code:
$sql 'SELECT sname, logo  FROM sender FOR UPDATE;'
10/06/2014 12:55 XxharCs#3
Ne daran kann es nicht liegen, da ich das auch ausprobiert hab^^
10/06/2014 13:10 _robox#4
Lasse Mall 'FOR UPDATE;' weg für die reine SELECT Anweisung wird sie ja gar nicht gebraucht.
10/06/2014 13:16 XxharCs#5
Mit dem FOR UPDATE isoliere ich nur den SELECT, sollte wer dazwischen was neues einfügen oder etwas ändern.
An der Query kann es nicht liegen da sie über eine normal SQL CLI super funktioniert.
Das prob ist das das php-script nach dem execute abschmiert
10/06/2014 13:31 _robox#6
das glaub ich dir das SQL CLI super funktioniert aber es muss nicht mit mysqli funktionieren
da mysqli manchmal merkwürdig Fehler verursacht die nicht immer logisch sind.

du solltest deine deine abfrage noch richtig abfangen
zum Beispiel mit einen try catch block.
PHP Code:
try 
{
$db = new mysqli('localhost''username''password''premiere');
            
            if(isset(
$_GET['order']) && isset($_GET['dir']))
            {
                if(
$_GET['order'] == '1')
                {
                        
$sql 'SELECT * FROM sender ORDER BY sname '.$_GET['dir'].' FOR UPDATE;';
                }elseif(
$_GET['order'] == '2')
                {
                        
$sql 'SELECT * FROM sender ORDER BY logo '.$_GET['dir'].' FOR UPDATE;';
                }
            }else
            {
                
$sql 'SELECT * FROM sender FOR UPDATE;';
            }
                
                
            
$stmt $db->prepare($sql);
            
$stmt->execute();
            
$stmt->bind_result($senderName$logo);

            while(
$stmt->fetch())
            {
                echo 
'<tr>';
                echo 
'<td>'.$senderName.'</td>';
                echo 
'<td>'.$logo.'</td>';
                echo 
'</tr>';
            }
            
$stmt->close(

  catch (
Exception $e
{
    echo 
'Fehler: ' htmlspecialchars($e->getMessage());

ps.
habe dein Code mal Lokal bei mir getestet und könnte keine Probleme feststellen.
10/06/2014 15:25 XxharCs#7
Sobald ich try-catch verwende, passiert garnichts mehr :confused:

Wurde bei dir die Table gefüllt? Was verwendest du und auf was hast du es getestet?
10/06/2014 15:33 _robox#8
ja alles ok schicke dir per PN ein Link da kannst du dich selber überzeugen

das ist ein gans normaler Testserver nichts besonderes
Windows Version: Windows 8.1 Pro 64-bit
XAMPP Version: 1.8.3
PHP: 5.5.6
mysql: 5.6.14
10/06/2014 16:11 XxharCs#9
Hab mittlerweile den Fehler gefunden :facepalm:. Mein Testbenutzer hatte keine Rechte auf die premiere DB, musste ihm diese verschaffen.

Habs mit hilfe von dem rausgefunden :facepalm:
Code:
if($db->connect_error) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}
Naja trotzdem danke an die Hilfe, ohne dem try-catch würd ich nicht draufkommen mysqli_connect_errno() zu verwenden :D
10/06/2014 16:23 _robox#10
nun ja kleine Ursache große Wirkung und auf das naheliegende kommt Mann erst zum Schluss nahe dem Mann den Fehler überall gesucht hat wie immer.

das ist mir auch schon oft genug passiert.