Problema con PHP + SQL !

  • Creatore Discussione Creatore Discussione idkfa46
  • Data di inizio Data di inizio

idkfa46

Utente Attivo
17 Ott 2010
40
0
0
Ciao ragazzi... sto litigando con una pagina del mio sito!

Ringraziandovi anticipatamente della vostra disponibilità, vi sottopongo il mio problema:

Ho creato una pagina con 2 righe da compilare e un tasto per inviare i dati con il seguente codice:

<div class="column1-unit" align="center">
<div class="contactform" align="center">
<form method="post" action="{$script_url}?act=key">
<fieldset><legend> {$user.name}'s MALL POINTS DELIVERING SISTEM </legend>
<p>Please enter here the key gonna active now:</p>
<p> <input type="text" name="act_key" id="act_key" class="bigfield" value="{$form_key}" tabindex="1" /></p>
<p>Please enter here the point's quantity:</p>
<p> <input type="text" name="points" id="points" class="bigfield" value="{$form_points}" tabindex="2" /></p>
<p><input type="submit" id="submit" class="button" name="a_key" value="Submit"></p>
</fieldset>
</form>
</div>
</div>

Riferito alla seguente pagina key.php che dovrebbe prendere i dati inseriti in precedenza e scriverli in un database sql (database WEBSITE, tabella item_key)

qui vi posto il codice relativo nel key.php:

if (isset($_SESSION['aid']))
{
if (isset($_POST['a_key'])) {

$act_key = trim((isset($_POST['act_key']) ? $_POST['act_key'] : ''));
$points = trim((isset($_POST['points']) ? $_POST['points'] : ''));

$actkey = doQuery("INSERT INTO item_key (act_key,wasted,points) VALUES ('$act_key','0','.$points.')", DATABASE_WEBSITE);


if(!$actkey)
{
$oSmarty->assign('message', array( 'type' => 'error',
'messages' => array( 'Error key' ) ) );
}
else
{
$oSmarty->assign('message', array( 'type' => 'ok',
'messages' => array( 'Your key has been succesful actived!' ) ) );
}
}
}
else
{
$oSmarty->assign('message', array( 'type' => 'error',
'messages' => array( 'Please log-in to acces this feature!.' ) ) );
}



all'interno della pagina visualizzo l'errore "Error key"
e se controllo il database infatti non viene compilata nessuna riga :incazz2:

Matteo.
 
ciao
scusa, ma ci sono alcune cose che non capisco
nel form htm ad es. per passare le variabili php (se sono variabili php) ho sempre visto questa sintassi

HTML:
<form method="post" action="<?php echo "$script_url?act=key"; ?>">

<input type="text" name="act_key" id="act_key" class="bigfield" value="<?php echo $form_key;?>" tabindex="1" />
cioè le varibili rinchiuse nei tag php talvolta anche
HTML:
<input type="text" name="act_key" id="act_key" class="bigfield" value="<?php =$form_key;?>" tabindex="1" />
comunque posso sbagliarmi.
inoltre nella parte php scrivi
PHP:
<?php
//.....
$actkey = doQuery("INSERT INTO item_key (act_key,wasted,points) VALUES ('$act_key','0','.$points.')", DATABASE_WEBSITE);
//......
$oSmarty->assign('message', array( 'type' => 'error', 'messages' => array( 'Error key' ) ) );
//.....
?>
doQuery è una tua funzione o classe? se si dove è definita la funzione o richiamata la classe?
sembrerebbe una classe in quanto poi dopo usi
$oSmarty->assign.....

inoltre una piccola cosa (altrimenti alex si arrabbia, e dato che è il tuo primo post ancora non lo conosci):
usa i tag html e php per racchiudere il codice (sono nella riga di formattazione del post)
 
La variabile $oSmarty contiene un'istanza di Smarty, un famoso template engine (che giustifica anche le variabili "strane" all'interno del form) quindi c'entra poco con la funzione doQuery. Mi interesserebbe invece vedere quest'ultima, perché ad una prima lettura lo script non presente problemi, perciò immagino che l'errore stia proprio lì.
 
allora allora...
La variabile doQuery la troviamo in inc.functions.db.php ed è la seguente:


PHP:
/**
	 * Switch the database-context to either Accountserver or GameDB.
	 *
	 * @param string $db
	 * @return string
	 */

	function selectDB($db)
	{

		global $connections,$config;

		if (!isset($connections[$db]))
			die('Core-Error: Invalid database in selectDB()');

		if ($connections[$db]===false)
		{

			$connections[$db]	= @mssql_connect($config['db'][$db]['host'],$config['db'][$db]['user'],$config['db'][$db]['pass']);

			if ($connections[$db] === false)
			{

				$msg		= mssql_get_last_message();

				echo '<b>Core-Error</b>: Failed to connect to database!<br />';

				if (trim($msg)!='')
					echo 'Error: '.htmlspecialchars($msg);
				else
				{

					if (trim(strtolower($config['db'][$db]['host'])) == 'MM8966-50BEEA14\SQLSSO')
						$config['db'][$db]['host']	= 'MM8966-50BEEA14\SQLSSO';

					// Lets see if we can establish a connection to the db-server

					$file      = @fsockopen ($config['db'][$db]['host'], 80, $errno, $errstr, 10);

					if (!$file)
						$status = -1;  // Site is down
					else
					{
						$status	= 0;
						fclose($file);
					}

					if ($status == -1)
						echo 'Error: #'.$errno.', '.htmlspecialchars($errstr).'';
					else
						echo 'Error: Please check if MSSQL-service is running <b>and</b> reachable (firewall, etc.).';

				}

				if (DEBUG)
				{
					echo '<br /><br />';
					echo '<b>Connection-Details</b>:<br /><br />';
					echo '<table width="400">';
					echo '<tr><td>Host:</td><td>'.htmlspecialchars($config['db'][$db]['host']).'</td></tr>';
					echo '<tr><td>User:</td><td>'.htmlspecialchars($config['db'][$db]['user']).'</td></tr>';
					echo '<tr><td>Password:</td><td>'.htmlspecialchars($config['db'][$db]['pass']).'</td></tr>';
					echo '<tr><td>Database:</td><td>'.htmlspecialchars($config['db'][$db]['db']).'</td></tr>';
					echo '</table>';
				}

				die('');

			}

		}

		if ($connections[$db]!==false)
			mssql_select_db($config['db'][$db]['db']);

	}

	/**
	 * This is mostly a wrapper for mssql_query which logs queries.
	 *
	 * @param string $query
	 * @return mixed
	 */

	function doQuery($query,$db='')
	{

		global $stats;

		if (DEBUG)
		{
			$stats['queries'][]	= $query;
			$stats['querycount']	= $stats['querycount']+1;	// Number of queries
		}

		// change DB if neccessary

		if ($db!=='')
			selectDB($db);

		// perform query

		$result	= @mssql_query($query);

		if (DEBUG)
		{

			$fh	= @fopen(BASEDIR.'data'.DIRECTORY_SEPARATOR.'dblog.txt','a');
			@fputs($fh,$query."\n");

			if ($result !== true)
			{

				$error		= mssql_get_last_message();

				if ((stristr($error,'Changed database context') === false) && (stristr($error,'Datenbankkontext wurde auf') === false))
				{
					@fputs($fh,"\n".'ERROR: '.mssql_get_last_message()."\n");
				}

			}

			@fputs($fh,"\n\n".str_repeat('=',80)."\n\n\n");

			@fclose($fh);

		}

		//

		return $result;

	}

	/**
	 *  Very simple function to create an INSERT-statement from an array
	 *
	 * @param string $table
	 * @param string $data
	 * @return string
	 */

	function getInsert($table,$data)
	{

		$fields			= array();
		$values			= array();

		foreach ($data as $curdata)
		{

			$fields[]	= $curdata['field'];

			switch (strtolower($curdata['type']))
			{
				case 'i'	:
					$values[]	= (int)$curdata['value'];
					break;
				case 's'	:
					$values[]	= '\''.addslashes_mssql($curdata['value']).'\'';
					break;
				case 'd'	:
					$values[]	= 'CONVERT(datetime, \''.date('Y-m-d H:i:s',(int)$curdata['value']).'\', 120)';
					break;
			}

		}

		return 'INSERT INTO '.$table.' ('.implode(', ',$fields).') VALUES ('.implode(', ',$values).')';

	}

	/**
	 * A n addslashes-function for mssql as mssql uses different escape-chars.
	 *
	 * @param string $str
	 * @param string $inlike
	 * @param string $escape
	 * @return string
	 */

	function addslashes_mssql($str,$inlike=false,$escape='!')
	{

		if (is_array($str))
		{
			foreach($str AS $id => $value) {
				$str[$id] = addslashes_mssql($value,$inlike);
			}
		}
		else
		{

			$str	= str_replace("'", "''", $str);

			if ($inlike)
			{
				$str	= str_replace($escape, $escape.$escape, $str);
				$str	= str_replace('%', $escape.'%', $str);
				$str	= str_replace('[', $escape.'[', $str);
				$str	= str_replace(']', $escape.']', $str);
				$str	= str_replace('_', $escape.'_', $str);
			}

		}

		return $str;

	}

?>


intendevi questo ?
Grazie per la disponibilità, Matteo
 
Ultima modifica:
Non può essere che io abbia sbagliato qualcosa nella creazione della tabella SQL ?
 
Potrebbe anche darsi. Sarebbe anche utile sapere l'errore preciso restituito dal database. Prova ad aggiungere dopo la chiamata alla funzione:
PHP:
or die(msql_error());
Alla fine deve venire una cosa del tipo:
PHP:
$actkey = doQuery('codice SQL...') or die(msql_error());
E vedi se ti restituisce qualcosa (probabilmente sì).
 
ho provato... ottengo il seguente errore:

Fatal error: Call to undefined function msql_error() in C:\xampp\htdocs\sitopower\pages\mall\inc.key.php on line 34

e la riga 34 è proprio quella che ho appena modificato:

PHP:
$actkey = doQuery("INSERT INTO item_key (act_key,wasted,points) VALUES ('$act_key','0','.$points.')", DATABASE_WEBSITE) or die (msql_error());

:incazz2:
 
BINGOOOOOOOOOOOOOOOOOOOoo
Problema risolto! è bastato modificare la riga:
PHP:
$actkey = doQuery("INSERT INTO item_key (act_key,wasted,points) VALUES ('$act_key','0','$points')", DATABASE_WEBSITE);
eliminando i puntini '.$points.' e '.$act_key.' !!!!

Ora però vorrei apportare una modifica... praticamente vorrei fare in modo che prima di scrivere la riga dovrei controllare che l' $act_key inserito non sia gia stato utilizzato per evitare di fare doppioni.... fattibile??? cosa consigliate???

grazie Matteo
 
ciao
prima di inserire fai una select di interrogazione con WHERE act_key='$act_key'.....
poi guardi se esistono record con


PHP:
$esistono=mysql_num_rows($query_interroga);
if($esistono==0){
   //inserisci il record
}else{
  echo "il valore $act_key è già esistente";
}
 
Grandi Ragazzi.... Grazie ancora!!!!
Diciamo che la verità stava nel mezzo... per farlo funzionare ho inserito il seguente codice:

$query = doQuery("SELECT * FROM item_key WHERE act_key = '$act_key'", DATABASE_WEBSITE);

PHP:
if(mssql_num_rows($query) > 0) 
                                                                                           { 
                                                                                                         $oSmarty->assign('message',			array( 'type'		=> 'error',
											'messages'	=> array( 'KEY USED, TRY WITH A DIFFERENT ONE!' ) ) );
                                                                                            } 
                                                                 else 
                                                                           { 


			$actkey = doQuery("INSERT INTO item_key (act_key,wasted,points) VALUES ('$act_key','0','$points')", DATABASE_WEBSITE);
			
			
			if(!$actkey) 
						{
							$oSmarty->assign('message',			array( 'type'		=> 'error',
											'messages'	=> array( 'Error key' ) ) );
						}
					else
						{				
							$oSmarty->assign('message',			array( 'type'		=> 'ok',
										'messages'	=> array( 'Your key has been succesful actived!' ) ) );
						}
                                                                              }

Praticamente come detto dal mitico Ale con la seguente modifica:
la parte
PHP:
$query = doQuery("SELECT * FROM item_key WHERE act_key = {$act_key}", DATABASE_WEBSITE);
è stata modificata così...
PHP:
$query = doQuery("SELECT * FROM item_key WHERE act_key = '$act_key'", DATABASE_WEBSITE);
come suggerito da Borgo Italia ;))))

Ehehehe Grazie ancora! tornerò presto a disturbarvi con nuovi dubbi :):):):):):)
Matteo
 

Discussioni simili