Script funktioniert nicht!

11/15/2013 15:33 vbacoder#1
Hi comm,

dieser code:

PHP Code:
<div class="con_top">Itemshop</div>
<div class="con_mid">

<?PHP

    
function canBuy()
    {
        if(!isset(
$_SESSION['nextBuy']))
        {
            
$_SESSION['nextBuy']=time();
        }
        
        if(
$_SESSION['nextBuy']<=time())
        {
            
$_SESSION['nextBuy']=time()+5;
            return 
true;
        }
        else
            return 
false;
    }

  if(isset(
$_SESSION['user_admin']) && checkInt($_SESSION['user_admin']) && $_SESSION['user_admin']>=0) {
  
    echo
'<h2>Itemshop - Einkauf</h2>';
    if(isset(
$_GET['id']) && checkInt($_GET['id'])) {
    
      
$sqlCmd="SELECT vnum, preis, attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, socket0, socket1, socket2 FROM ".SQL_HP_DB.".is_items WHERE id='".$_GET['id']."' AND anzeigen='J' LIMIT 1";
      
$sqlQry=mysql_query($sqlCmd,$sqlHp);
      if(
mysql_num_rows($sqlQry)==1) {
      
        
$getItem=mysql_fetch_object($sqlQry);
        
        
$sqlCoins "SELECT coins FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1";
        
        
$sqlCoinsb mysql_query("SELECT coins FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1");
        
$qryCoins mysql_query($sqlCoins,$sqlServ);
        
$getCoins mysql_fetch_object($qryCoins);
        
$username mysql_query("SELECT (`login`) FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1");
        
$getusername mysql_fetch_array($username);
        
$cccc mysql_query("SELECT (`times`) as amount FROM account.vote WHERE account='".mysql_fetch_array($username)."' LIMIT 1"); 
        
        list(
$DeinErgebniss) = mysql_fetch_array($cccc);
        if (
$DeinErgebniss >= 16) {  
         
        
$xxx mysql_query("UPDATE account.account SET status = 'BLOCK' WHERE login='$account'"); 
        
$xxxx mysql_query("UPDATE account.account SET coins = '0' WHERE login='$account'"); 
        
header("Location: http://***/bug.html"); 

    exit; 
    } else {  
        if(
canBuy())
        {
            if((
$getCoins->coins)>=$getItem->preis) {
          
              
$getGroesse compareItems($getItem->vnum);
              
$belPos checkPos($_SESSION['user_id']);
              
$possiblePos findPos($belPos['islager'],$getGroesse['groesse']);
              if(!empty(
$possiblePos)) {
                
                
$nCoins $getCoins->coins-$getItem->preis;
                
                
$sqlCmd="UPDATE account.account SET coins='".mysql_real_escape_string($nCoins)."' WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1";
                
$sqlQry=mysql_query($sqlCmd,$sqlServ);
                
                
$sqlLog="INSERT INTO ".SQL_HP_DB.".is_log (account_id,vnum,preis,zeitpunkt) VALUES ('".mysql_real_escape_string($_SESSION['user_id'])."','".$getItem->vnum."','".$getItem->preis."','".$sqlZeit."')";
                
$qryLog=mysql_query($sqlLog,$sqlHp);
                
                
$sqlItem="INSERT INTO player.item 
                (owner_id,window,pos,count,vnum,attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, socket0, socket1, socket2)
                VALUES 
                ('"
.mysql_real_escape_string($_SESSION['user_id'])."','MALL','".$possiblePos[0]."','1','".$getItem->vnum."','".$getItem->attrtype0."', '".$getItem->attrvalue0."', '".$getItem->attrtype1."', '".$getItem->attrvalue1."', '".$getItem->attrtype2."', '".$getItem->attrvalue2."', '".$getItem->attrtype3."', '".$getItem->attrvalue3."', '".$getItem->attrtype4."', '".$getItem->attrvalue4."', '".$getItem->attrtype5."', '".$getItem->attrvalue5."', '".$getItem->attrtype6."', '".$getItem->attrvalue6."', '".$getItem->socket0."', '".$getItem->socket1."', '".$getItem->socket2."')";
                
$qryItem=mysql_query($sqlItem,$sqlServ) or die(mysql_error());
                
                echo
'<p class="meldung">Das item wurde erfolgreich gekauft. Sollte das Item nicht im Lager erscheinen, bitte umgehend bei einem Admin melden.</p>';
                
              }
              else {
                echo
'<p>Sie haben nicht genügend Platz in ihrem Itemshop-Lager. Ihr Guthaben wurde nicht verändert.</p>';
              }
              
            }
            else {
              echo
'<p class="meldung">Sie haben nicht genug Coins.</p>';
            }
        }
        else
        {
            echo
'<p class="meldung">Es kann nur alle 5 Sekunden ein Item gekauft werden.</p>';
        }
        }
      }
      else {
        echo
'<p class="meldung">Das angegebe Item existiert nicht.</p>';
      }
    }
    else {
      echo
'<p class="meldung">Es wurde keine gültige ID eingegeben.</p>';
    }
    echo
'<p><a href="javascript:history.back()">zurück</a></p>';
  }
  else {
    echo
'<p class="meldung">Sie müssen für diesen Bereich angemeldet sein.</p>';
  }
?>

</div>
<div class="con_bot"></div>
soll user mit zu vielen votes blocken beim kaufen im itemshop.
der hauptsächlich nicht funktionierende teil beginnt etwa bei zeile 30

Man kann item kaufen ohne gebannt zu werden bei 10000 times in account.vote.

ich hoffe jemand kann mir vtl sagen wie ich es richtig mache aber achtung: Der Nutzer muss nicht zwingend in account.vote existieren ;)

LG,
vbacoder:handsdown::handsdown::handsdown:
11/16/2013 16:22 vbacoder#2
weis keiner weiter?
11/16/2013 16:40 mhaendler#3
Ich kann dir leider jetzt Pauschal auch nicht helfen allerdings könntest du anfangen die einzelnen Werte zu debuggen (var_dump($variable);die();) schau dir an was dort drinnen steht eventuell findest du selbst den Fehler :))
11/16/2013 16:47 adistoe#4
PHP Code:
if(canBuy()) 
Ich denke da müsste noch was dazu:

PHP Code:
if(canBuy()==true
[Only registered and activated users can see links. Click Here To Register...]
11/16/2013 17:19 vbacoder#5
daran liegt es nicht glaube ich.
Quote:
Catchable fatal error: Object of class stdClass could not be converted to string in ******/pages/is_buy.php on line 40
PHP Code:
<div class="con_top">Itemshop</div>
<div class="con_mid">

<?PHP

    
function canBuy()
    {
        if(!isset(
$_SESSION['nextBuy']))
        {
            
$_SESSION['nextBuy']=time();
        }
        
        if(
$_SESSION['nextBuy']<=time())
        {
            
$_SESSION['nextBuy']=time()+5;
            return 
true;
        }
        else
            return 
false;
    }

  if(isset(
$_SESSION['user_admin']) && checkInt($_SESSION['user_admin']) && $_SESSION['user_admin']>=0) {
  
    echo
'<h2>Itemshop - Einkauf</h2>';
    if(isset(
$_GET['id']) && checkInt($_GET['id'])) {
    
      
$sqlCmd="SELECT vnum, preis, attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, socket0, socket1, socket2 FROM ".SQL_HP_DB.".is_items WHERE id='".$_GET['id']."' AND anzeigen='J' LIMIT 1";
      
$sqlQry=mysql_query($sqlCmd,$sqlHp);
      if(
mysql_num_rows($sqlQry)==1) {
      
        
$getItem=mysql_fetch_object($sqlQry);
        
        
$sqlCoins "SELECT coins FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1";
        
        
$sqlCoinsb mysql_query("SELECT coins FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1");
        
$qryCoins mysql_query($sqlCoins,$sqlServ);
        
$getCoins mysql_fetch_object($qryCoins);
        
$username mysql_query("SELECT (`login`) as string FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1");
        
$getusername mysql_fetch_object($username);
        
$cccc mysql_query("SELECT (`times`) as amount FROM account.vote WHERE account='$getusername'"); 
        
        list(
$DeinErgebniss) = mysql_fetch_array($cccc);
        if (
$DeinErgebniss >= 16) {  
         
        
$xxx mysql_query("UPDATE account.account SET status = 'BLOCK' WHERE login='$account'"); 
        
$xxxx mysql_query("UPDATE account.account SET coins = '0' WHERE login='$account'"); 
        
header("Location: http://***/bug.html"); 

    exit; 
    } else {  
        if(
canBuy())
        {
            if((
$getCoins->coins)>=$getItem->preis) {
          
              
$getGroesse compareItems($getItem->vnum);
              
$belPos checkPos($_SESSION['user_id']);
              
$possiblePos findPos($belPos['islager'],$getGroesse['groesse']);
              if(!empty(
$possiblePos)) {
                
                
$nCoins $getCoins->coins-$getItem->preis;
                
                
$sqlCmd="UPDATE account.account SET coins='".mysql_real_escape_string($nCoins)."' WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1";
                
$sqlQry=mysql_query($sqlCmd,$sqlServ);
                
                
$sqlLog="INSERT INTO ".SQL_HP_DB.".is_log (account_id,vnum,preis,zeitpunkt) VALUES ('".mysql_real_escape_string($_SESSION['user_id'])."','".$getItem->vnum."','".$getItem->preis."','".$sqlZeit."')";
                
$qryLog=mysql_query($sqlLog,$sqlHp);
                
                
$sqlItem="INSERT INTO player.item 
                (owner_id,window,pos,count,vnum,attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, socket0, socket1, socket2)
                VALUES 
                ('"
.mysql_real_escape_string($_SESSION['user_id'])."','MALL','".$possiblePos[0]."','1','".$getItem->vnum."','".$getItem->attrtype0."', '".$getItem->attrvalue0."', '".$getItem->attrtype1."', '".$getItem->attrvalue1."', '".$getItem->attrtype2."', '".$getItem->attrvalue2."', '".$getItem->attrtype3."', '".$getItem->attrvalue3."', '".$getItem->attrtype4."', '".$getItem->attrvalue4."', '".$getItem->attrtype5."', '".$getItem->attrvalue5."', '".$getItem->attrtype6."', '".$getItem->attrvalue6."', '".$getItem->socket0."', '".$getItem->socket1."', '".$getItem->socket2."')";
                
$qryItem=mysql_query($sqlItem,$sqlServ) or die(mysql_error());
                
                echo
'<p class="meldung">Das item wurde erfolgreich gekauft. Sollte das Item nicht im Lager erscheinen, bitte umgehend bei einem Admin melden.</p>';
                
              }
              else {
                echo
'<p>Sie haben nicht genügend Platz in ihrem Itemshop-Lager. Ihr Guthaben wurde nicht verändert.</p>';
              }
              
            }
            else {
              echo
'<p class="meldung">Sie haben nicht genug Coins.</p>';
            }
        }
        else
        {
            echo
'<p class="meldung">Es kann nur alle 5 Sekunden ein Item gekauft werden.</p>';
        }
        }
      }
      else {
        echo
'<p class="meldung">Das angegebe Item existiert nicht.</p>';
      }
    }
    else {
      echo
'<p class="meldung">Es wurde keine gültige ID eingegeben.</p>';
    }
    echo
'<p><a href="javascript:history.back()">zurück</a></p>';
  }
  else {
    echo
'<p class="meldung">Sie müssen für diesen Bereich angemeldet sein.</p>';
  }
?>

</div>
<div class="con_bot"></div>
11/16/2013 18:21 Mikesch01#6
Was ist denn bei dir Zeile 40?

Schaut so aus, als würdest du ein Objekt ausgeben wollen.
11/16/2013 18:37 Muddy Waters#7
Quote:
Originally Posted by adistoe View Post
PHP Code:
if(canBuy()) 
Ich denke da müsste noch was dazu:

PHP Code:
if(canBuy()==true
Das muss nicht dazu und ist in dieser Form absolut überflüssig, nicht nur n PHP sondern eigentlich überall.

[Only registered and activated users can see links. Click Here To Register...]
Quote:
Originally Posted by vbacoder View Post
daran liegt es nicht glaube ich.


PHP Code:
<div class="con_top">Itemshop</div>
<div class="con_mid">

<?PHP

    
function canBuy()
    {
        if(!isset(
$_SESSION['nextBuy']))
        {
            
$_SESSION['nextBuy']=time();
        }
        
        if(
$_SESSION['nextBuy']<=time())
        {
            
$_SESSION['nextBuy']=time()+5;
            return 
true;
        }
        else
            return 
false;
    }

  if(isset(
$_SESSION['user_admin']) && checkInt($_SESSION['user_admin']) && $_SESSION['user_admin']>=0) {
  
    echo
'<h2>Itemshop - Einkauf</h2>';
    if(isset(
$_GET['id']) && checkInt($_GET['id'])) {
    
      
$sqlCmd="SELECT vnum, preis, attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, socket0, socket1, socket2 FROM ".SQL_HP_DB.".is_items WHERE id='".$_GET['id']."' AND anzeigen='J' LIMIT 1";
      
$sqlQry=mysql_query($sqlCmd,$sqlHp);
      if(
mysql_num_rows($sqlQry)==1) {
      
        
$getItem=mysql_fetch_object($sqlQry);
        
        
$sqlCoins "SELECT coins FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1";
        
        
$sqlCoinsb mysql_query("SELECT coins FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1");
        
$qryCoins mysql_query($sqlCoins,$sqlServ);
        
$getCoins mysql_fetch_object($qryCoins);
        
$username mysql_query("SELECT (`login`) as string FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1");
        
$getusername mysql_fetch_object($username);
        
$cccc mysql_query("SELECT (`times`) as amount FROM account.vote WHERE account='$getusername'"); 
        
        list(
$DeinErgebniss) = mysql_fetch_array($cccc);
        if (
$DeinErgebniss >= 16) {  
         
        
$xxx mysql_query("UPDATE account.account SET status = 'BLOCK' WHERE login='$account'"); 
        
$xxxx mysql_query("UPDATE account.account SET coins = '0' WHERE login='$account'"); 
        
header("Location: http://***/bug.html"); 

    exit; 
    } else {  
        if(
canBuy())
        {
            if((
$getCoins->coins)>=$getItem->preis) {
          
              
$getGroesse compareItems($getItem->vnum);
              
$belPos checkPos($_SESSION['user_id']);
              
$possiblePos findPos($belPos['islager'],$getGroesse['groesse']);
              if(!empty(
$possiblePos)) {
                
                
$nCoins $getCoins->coins-$getItem->preis;
                
                
$sqlCmd="UPDATE account.account SET coins='".mysql_real_escape_string($nCoins)."' WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1";
                
$sqlQry=mysql_query($sqlCmd,$sqlServ);
                
                
$sqlLog="INSERT INTO ".SQL_HP_DB.".is_log (account_id,vnum,preis,zeitpunkt) VALUES ('".mysql_real_escape_string($_SESSION['user_id'])."','".$getItem->vnum."','".$getItem->preis."','".$sqlZeit."')";
                
$qryLog=mysql_query($sqlLog,$sqlHp);
                
                
$sqlItem="INSERT INTO player.item 
                (owner_id,window,pos,count,vnum,attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, socket0, socket1, socket2)
                VALUES 
                ('"
.mysql_real_escape_string($_SESSION['user_id'])."','MALL','".$possiblePos[0]."','1','".$getItem->vnum."','".$getItem->attrtype0."', '".$getItem->attrvalue0."', '".$getItem->attrtype1."', '".$getItem->attrvalue1."', '".$getItem->attrtype2."', '".$getItem->attrvalue2."', '".$getItem->attrtype3."', '".$getItem->attrvalue3."', '".$getItem->attrtype4."', '".$getItem->attrvalue4."', '".$getItem->attrtype5."', '".$getItem->attrvalue5."', '".$getItem->attrtype6."', '".$getItem->attrvalue6."', '".$getItem->socket0."', '".$getItem->socket1."', '".$getItem->socket2."')";
                
$qryItem=mysql_query($sqlItem,$sqlServ) or die(mysql_error());
                
                echo
'<p class="meldung">Das item wurde erfolgreich gekauft. Sollte das Item nicht im Lager erscheinen, bitte umgehend bei einem Admin melden.</p>';
                
              }
              else {
                echo
'<p>Sie haben nicht genügend Platz in ihrem Itemshop-Lager. Ihr Guthaben wurde nicht verändert.</p>';
              }
              
            }
            else {
              echo
'<p class="meldung">Sie haben nicht genug Coins.</p>';
            }
        }
        else
        {
            echo
'<p class="meldung">Es kann nur alle 5 Sekunden ein Item gekauft werden.</p>';
        }
        }
      }
      else {
        echo
'<p class="meldung">Das angegebe Item existiert nicht.</p>';
      }
    }
    else {
      echo
'<p class="meldung">Es wurde keine gültige ID eingegeben.</p>';
    }
    echo
'<p><a href="javascript:history.back()">zurück</a></p>';
  }
  else {
    echo
'<p class="meldung">Sie müssen für diesen Bereich angemeldet sein.</p>';
  }
?>

</div>
<div class="con_bot"></div>
Ich hab nun nicht soviel Zeit, zumal dein Code auch ziemlich schlecht lesbar ist. Ich würde dir einfach raten das ganze zu debuggen, also entweder über Ausgaben via var_dump() an der betroffenen Stelle oder - sofern vorhanden - über einen richtigen Debugger über deine Entwicklungsumgebung.

Generell wirkt das auf den ersten Blick alles etwas unübersichtlich. Man kann und darf beispielsweise MySQL-Queries auch auf mehrere Zeilen verteilen, sodass man diese hinterher sogar noch lesen kann. Außerdem scheinen dort ein paar redundante Schritte enthalten zu sein.

PHP Code:
$sqlCoins "SELECT coins FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1";

$sqlCoinsb mysql_query("SELECT coins FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1");
$qryCoins mysql_query($sqlCoins,$sqlServ);
$getCoins mysql_fetch_object($qryCoins);
$username mysql_query("SELECT (`login`) as string FROM account.account WHERE id='".mysql_real_escape_string($_SESSION['user_id'])."' LIMIT 1");
$getusername mysql_fetch_object($username);; 
Hier führst du zum Beispiel zwei Abfragen aus, um Werte aus derselben Reihe der account-Tabelle zu lesen. Das ist total ineffizient, dafür solltest du nur eine Abfrage verwenden, also sowas wie:
PHP Code:
$queryres mysql_query("
    SELECT login, coins
    FROM account.account
    WHERE id='" 
mysql_real_escape_string($_SESSION['user_id']) . "'
    LIMIT 1
"
$sqlHp);

if(
$queryrow mysql_fetch_array(queryres))
{
    
var_dump(
        
"Coins: $queryrow[coins]",
        
"Login: $queryrow[login]"
    
);

Ich würde ebenfalls auf die Verwendung von Variablen für Query-Strings verzichten, wenn du diese ohnehin nur ein einziges mal verwendest. Wenn du dann noch ordentlich einrückst, hier und da ein paar mehr Leerzeichen und Kommentare hinterlässt, wird dein Code sehr viel besser lesbar und damit tust du nicht nur all denjenigen einen Gefallen, die deinen Code lesen, sondern vor allem dir selbst (wenn du das ganze in ein paar Wochen/Monaten nachvollziehen willst/musst).
11/16/2013 21:15 iMarkt#8
Die Zeile 40 wäre ganz interessant.
Ohne diese zu kennen: grob geschaut liegt dieser Fehler möglicherweise darin, dass die Query false zurückggibt, was du als Object verarbeiten willst -> Meep.

Poste bitte einmal deine Zeile 40.
Ps: Ich hoffe, deine Sessions sind durch Sicherheitsmechanismen abgesichert :)
Ps: Bezüglich MySQL-Injections, wenn du Zeit hast: mysqli
11/17/2013 13:45 vbacoder#9
Danke :D

Z40:

PHP Code:
$cccc mysql_query("SELECT (`times`) as amount FROM account.vote WHERE account='$getusername'"); 
11/17/2013 14:14 Muddy Waters#10
Eigentlich ist die Fehlermeldung recht eindeutig, wenn du dir die Zeile anschaust - iMarkt hat es bereits angedeutet. Du lässt dir via mysql_fetch_object() die gefundene Reihe in der account-Tabelle als Standardobjekt zurückgeben, also als eine Instanz der Klasse stdClass.

PHP Code:
"SELECT (`times`) as amount FROM account.vote WHERE account='$getusername'" 
Hier sagst du deinem PHP-Interpreter, dass dieser doch bitte jenes Objekt in einen String einfügen soll - dazu muss das Objekt aber zunächst in einen String umgewandelt werden. Da es sich bei dem Objekt aber um einen komplexen Datentyp handelt, kann dein PHP-Interpreter nicht ohne weiteres wissen, wie genau eine sinnvolle String-Representation davon aussehen soll, weshalb eine implizite Umwandlung nicht möglich ist.
Ohne diese Umwandlung kann die Anweisung aber nicht ausgeführt werden, daher wird das Script dort mit einer Fehlermeldung gestoppt.

Die Lösung dafür ist recht simpel:
Du musst dir bewusst sein, was $getusername eigentlich ist (nämlich ein Objekt der Klasse stdClass) und es auch als solches behandeln.

Also:
PHP Code:
$cccc mysql_query("SELECT (`times`) as amount FROM account.vote WHERE account='{$getusername->string}'"); 
Wobei ich generell eher die Reihen als [Only registered and activated users can see links. Click Here To Register...] ausgeben würde, das ist in der Handhabung etwas bequemer als ein Standardobjekt.
11/17/2013 15:04 vbacoder#11
Einwandfrei :D
Danke :)