webForumDet fria alternativet

Hjälp med databasfel, en ny user skapas

PHP

5 svar · 296 visningar · startad av FunTrix

Medlem sedan okt. 2003118 inlägg
Frågan#1

Hejsan!
Jag undrar om någon kan hjälpa mig att fixa till följande?
Det är nämligen så att varje gång en användare loggar in så skapas det en ny användare i min databas, använderen får inget namn utan det som läggs till är ett användarid samt att ip adressen loggas så nu hoppas jag på att någon här kan hjälpa mig fixa till det felet...

<?php
 
error_reporting(E_ALL);
ini_set("display_errors", "1");
 
session_start(); //alltid överst på sidan
 
include "conn.php"; // Databasanslutningen 
 
// Inloggning 
if (isset($_POST['uploadsubmit'])){

  // Krypteringsfunktion för inloggningen
  $pass = md5($_POST['passwd']);

  $sql = "SELECT user, id, admin FROM uploadmembers
         WHERE user='{$_POST['user']}'
         AND pass='$pass'";
  $result = mysql_query($sql);
  
  // Hittades inte användarnamn och lösenord 
  // skicka till formulär med felmeddelande 
  if (mysql_num_rows($result) == 0){
  header("Location: index.php?badlogin="); 
    exit; 
  } 
  
  // Sätt sessionen med unikt index
  $row = mysql_fetch_assoc($result);
   $_SESSION['sess_user'] = $_POST['user']; 
  $_SESSION['sess_id'] = $row['id'];
  if ($row['admin'] > 0) {
     $_SESSION['sess_admin'] = $row['admin'];
  }
  
  //Lägg in IP-nummer
 mysql_query("UPDATE uploadmembers SET ip = '{$_SERVER['REMOTE_ADDR']}' WHERE user = '{$_POST['user']}'") or die(mysql_error() . '<br>' . $sql); 
   if(mysql_affected_rows() == 0) {
 $ip = "INSERT INTO uploadmembers SET ip = '{$_SERVER['REMOTE_ADDR']}'";
mysql_query($ip) or die(mysql_error());
}
  //Lägg in 'Senast Inloggad'
   $senastinne = "UPDATE uploadmembers SET senastinne = now() WHERE user = '{$_POST['user']}'";
   mysql_query($senastinne) or die(mysql_error() . '<br>' . $sql);
   if(mysql_affected_rows() == 0) {
    $senastinne = "INSERT INTO uploadmembers SET senastinne = now()";
    mysql_query($senastinne) or die(mysql_error());
}
  header("Refresh: 0;URL=upload.php");
  exit; 
} 
 
// Utloggning 
if (isset($_GET['logout'])){ 
  session_unset(); 
  session_destroy(); 
  header("Location: index.php"); 
  exit; 
} 
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title><? $sql = "SELECT value FROM various WHERE name = 'title'";  $result = mysql_query($sql) or die("SQL: $sql <br>".mysql_error());  echo mysql_result($result, 0, 'value'); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<div align="center">
  <form action="index.php" method="post" name="" id="">
    <table width="100%" height="200"  border="0" cellpadding="0" cellspacing="0">
      <tr>
        <td><div align="center" class="style1"><img src="pictures/loggain.gif" width="136" height="37"></div></td>
      </tr>
      <tr>
        <td><div align="center"></div></td>
      </tr>
      <tr>
        <td><div align="center">
          <table width="42%"  border="0" cellspacing="0" cellpadding="0">
            <tr>
              <td colspan="2"><div align="center"><font size="1">
                <?php

// Om inte inloggad visa formul&auml;r, annars logga ut-l&auml;nk 
if (!isset($_SESSION['sess_user'])){

   // Visa felmeddelande vid felaktig inloggning 
   if (isset($_GET['badlogin'])){
      echo "Fel anv&auml;ndarnamn eller l&ouml;senord!<br>\n";
      echo "F&ouml;rs&ouml;k igen!\n";
   }

?>
              </font></div></td>
            </tr>
            <tr>
              <td><div align="right">Anv&auml;ndarnamn:</div></td>
              <td width="50%"><input name="user" type="text" id="user4" size="30"></td>
            </tr>
            <tr>
              <td><div align="right">L&ouml;senord:</div></td>
              <td><input name="passwd" type="password" id="passwd" size="30"></td>
            </tr>
            <tr>
              <td colspan="2"><div align="center"><font color="#000000" size="1">
                <?php

} else {

   echo "<a href=\"upload.php\">Du &auml;r redan inloggad, g&aring; till uploaden h&auml;r.</a>\n";
   echo "<a href=\"index.php?logout=\">Logga ut</a>\n";

}

?>
              </font></div></td>
            </tr>
          </table>
        </div></td>
      </tr>
      <tr>
        <td><div align="center">
          <input name="uploadsubmit" type="submit" id="uploadsubmit" value="LOGGA IN">
        </div></td>
      </tr>
    </table>
  </form>
</div>
</body>
</html>
Medlem sedan mars 20034 471 inlägg
#2

Vad vill du ska hända? Vad sker nu? Är osäker på vilket du beskriver ovan?

Medlem sedan okt. 2003118 inlägg
#3

Det jag vill ska hända är man bara ska kunna logga in där och att ingen ny användare skapas i databasen varje gång en person loggar in.... säg att om användare gustav loggar in så skapas det en ny rad i databasen varje gång han loggar in, denna rad inne ett nytt användar id och gustavs ip numer... visst jag vill att ip numret ska loggas och uppdatera gustavs redan skapade profil vilket den gör också men att den lägger till en ny rad i databasen varje gång en användare loggar in är grymt ireterande...

Medlem sedan mars 20034 471 inlägg
#4

OK, tack. :)

De enda två rader som lägger till nya rader i databasen är här:

<?php
 
if (isset($_POST['uploadsubmit'])){
  // gör en massa saker

  //Lägg in IP-nummer
 mysql_query("UPDATE uploadmembers SET ip = '{$_SERVER['REMOTE_ADDR']}' WHERE user = '{$_POST['user']}'") or die(mysql_error() . '<br>' . $sql); 
   if(mysql_affected_rows() == 0) {
 //Insertrad 1
 $ip = "INSERT INTO uploadmembers SET ip = '{$_SERVER['REMOTE_ADDR']}'";
mysql_query($ip) or die(mysql_error());
}
  //Lägg in 'Senast Inloggad'
   $senastinne = "UPDATE uploadmembers SET senastinne = now() WHERE user = '{$_POST['user']}'";
   mysql_query($senastinne) or die(mysql_error() . '<br>' . $sql);
   if(mysql_affected_rows() == 0) {
    //Insertrad 2
    $senastinne = "INSERT INTO uploadmembers SET senastinne = now()";
    mysql_query($senastinne) or die(mysql_error());
}

  //gör mera saker
?>

Det faktum att det läggs in innebär att INSERTen körs, alltså av någon orsak fungerar minst ett av UPDATE-satserna inte. Dvs den hittar ingen rad att uppdatera.

Sedan begriper jag inte varför du uppdaterar ip och tid var för sig? Det verkar också vara fel syntax på dina INSERT.

Pröva följande:

  //Lägg in IP-nummer och senast inne
$sql = "UPDATE uploadmembers 
          SET ip = '{$_SERVER['REMOTE_ADDR']}', senastinne = NOW()  
          WHERE user = '{$_POST['user']}' ";
echo $sql; //Ser satsen ut som du hade tänkt dig? 
mysql_query($sql) or die(mysql_error() . '<br>' . $sql); 
if(mysql_affected_rows() == 0) {
     //Insertrad 1 - om du då vill lägga in ny användare?
     $ipTid = "INSERT INTO uploadmembers(<alla kolumnnamn>) 
                 VALUES (<värden för alla kolumner, inklusive ip och tid och allt annat som lagras på en rad>);
      mysql_query($ipTid) or die(mysql_error());
}

  //gör mera saker
?>
Medlem sedan aug. 2001145 inlägg
#5

Kan ge lite info om varför de sätt in en ny användare när man loggar in och de är för att affected_rows endast ökar om den faktiskt ändras.
Dvs, du updaterar ip i en query och eftersom ip kanske inte ändrats sedan han/hon sist loggade in så görs ingen uppdatering och affected_rows blir 0.

Nu slipper du kanske bli fundersam nästa gång du får flera inlägg efter en update.

Medlem sedan mars 20034 471 inlägg
#6

Dies_Irae skrev:

... Dvs, du updaterar ip i en query och eftersom ip kanske inte ändrats sedan han/hon sist loggade in så görs ingen uppdatering och affected_rows blir 0...

Ah!

Om du vill kan du göra så här:

//Lägg in IP-nummer och senast inne 
$exist = "SELECT user FROM uploadmembers WHERE user = '{$_POST['user']}' "; 
$res = mysql_query($exist) or die(mysql_error() . '<br>' . $exist); 
if (mysql_num_rows($res) > 0) { //Han/Hon finns i databasen, uppdatera
   $sql = "UPDATE uploadmembers 
          SET ip = '{$_SERVER['REMOTE_ADDR']}', senastinne = NOW()   
          WHERE user = '{$_POST['user']}' "; 
   mysql_query($sql) or die(mysql_error() . '<br>' . $sql); 
}
else { //Lägg in honom/henne
     //Insertrad 1 - om du då vill lägga in ny användare? 
     $ipTid = "INSERT INTO uploadmembers(<alla kolumnnamn>) 
                 VALUES (<värden för alla kolumner, inklusive ip och tid och allt annat som lagras på en rad>)"; 
      mysql_query($ipTid) or die(mysql_error()); 
}

Men i och med att du uppdaterar både ip och tiden i samma query, blir det en uppdatering, för tiden har med nödvändighet ändrats. :)

387 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
122 ms — hämta statistik (db)
132 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)