Jump to content
joka503

Basa de Dados - Inserir Dados

Recommended Posts

joka503

Nós temos vários itens na base de dados e queremos que ele actualize os preços de todos os itens.

O que temos para já é isto:

# Get price of item from database
$stmt = $db->prepare('SELECT * FROM items ');
$stmt->bindValue(':name', $marketName);
$stmt->execute();

$item = $stmt->fetch();

$price = intval($item['avgPrice30Days']);

# If the 30 day average is 0, set it to the 7 day average
if ($price === 0) {
$price = intval($item['avgPrice7Days']);
}

# If the 7 day average is 0 again, set it to the current price
if ($price === 0) {
$price = intval($item['currentPrice']);
}

if ($price === 0) {
$price = intval($item['suggestedPriceMin']);
}

# If all of those are 0, set it to the Steam market price
if ($price === 0) {
$hash = urlencode($marketName);
$marketObj = json_decode(file_get_contents("http://steamcommunity.com/market/priceoverview/?currency=1&appid=730&market_hash_name=$hash"), true);
if ($marketObj['success'] !== true) {
echo jsonErr('An error occured while fetching market price for an item.');
return;
}

$medianPrice = $marketObj['median_price'];
$lowestPrice = $marketObj['lowest_price'];

if (!isset($medianPrice) && !isset($lowestPrice)) {
echo jsonErr('One or more items was not found on the steam market place.');
return;
}

if (isset($medianPrice)) {
$price = doubleval(substr($medianPrice, 1)) * 100;
} else {
$price = doubleval(substr($lowestPrice, 1)) * 100;
}

$insert_price="insert into items (avgPrice7Days) VALUES ('$price') Where marketName is $marketName"

$do_insert_price=mysql_query($insert_price);

}

Base de dados com mais de 5000 itens:

http://prntscr.com/8lmifp

Queremos que ele corra o código por cada item e que altere o preço na base de dados consoante o preço obtido no url inserido no código.

O grande problema está em saber se ao seleccionar todos os itens, o código corre com os dados de um só item de cada vez ou de todos os itens.

Para o código resultar precisamos também de ter o nome do item presente na base de dados (não sei se a 2ª linha de código está a funcionar pois supostamente é esta que vai buscar o nome do item).

Queríamos ajuda para correr o código.

Share this post


Link to post
Share on other sites
HappyHippyHippo

antes de mais, se pretendes obter todos os registos em que vários campos tenham um valor definido, faz a escolha no query de SQL:

SELECT * FROM items WHERE avgPrice30Days = 0 AND currentPrice = 0 AND suggestedPriceMin = 0

só isto elimina metade das linhas do código que apresentas.

depois, tens algo que não faz sentido:

$medianPrice = $marketObj['median_price']; // <-----------------------------------------------------+
$lowestPrice = $marketObj['lowest_price'];                                                       // |
                                                                                                // |
if (!isset($medianPrice) && !isset($lowestPrice)) {                                              // |
echo jsonErr('One or more items was not found on the steam market place.');                      // |
return;                                                                                          // |
}                                                                                                // |
                                                                                                // |
if (isset($medianPrice)) {  // <-- isto vai estar sempre definido, olha bem para o que tens acima --+
                           //     como vês, a variável existe sempre, logo a condição do if irá sempre ser verdadeira

por fim, tu não tens qualquer ciclo a ser condicionado pelos registos retornados pelo servidor de SQL, logo as verificações, claramente só serão aplicadas ao primeiro registo obtido através da chamada da função "fetch"

deverias ter algo do género:


while ($item = $stmt->fetch()) {
// do whatever
}
[/Code]


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joka503

Fiz as alterações necessárias.

Ficou assim, da maneira como está ele só para quando não houver zeros ou quando acaba a lista?

<?php
function getDB() {
$dbHost = '******';
$db	 = '*****';
$dbUser = '****';
# Get database password from outside of web root
$fileLoc = $_SERVER['DOCUMENT_ROOT'] . '/passwords.txt';
if (file_exists($fileLoc)) {
$fh = fopen($fileLoc, 'r');
$jsonStr = fgets($fh);
$arr = json_decode($jsonStr, true);
$dbPass = $arr['default-password'];
fclose($fh);
} else {
die('no file found');
}
$db = new PDO("mysql:host=$dbHost;dbname=$db;charset=utf8", $dbUser, $dbPass);
return $db;
}
# Get price of item from database
$stmt = $db->prepare('SELECT * FROM items WHERE avgPrice30Days = 0 AND currentPrice = 0 AND suggestedPriceMin = 0');
$stmt->bindValue(':name', $marketName);
$stmt->execute();
while ($item = $stmt->fetch()) {
// do whatever

$price = intval($item['avgPrice30Days']);
# If all of those are 0, set it to the Steam market price
if ($price === 0) {
$hash = urlencode($marketName);
$marketObj = json_decode(file_get_contents("http://steamcommunity.com/market/priceoverview/?currency=1&appid=730&market_hash_name=$hash"), true);
if ($marketObj['success'] !== true) {
echo jsonErr('An error occured while fetching market price for an item.');
return;
}
$lowestPrice = $marketObj['lowest_price'];

$price = doubleval(substr($lowestPrice, 1)) * 100;

$insert_price="insert into items (avgPrice7Days) VALUES ('$price') Where marketName is $marketName"

$do_insert_price=mysql_query($insert_price);

}
}
?>

Na base de dados estamos a guardar o lowest_price, como visto neste link :

http://steamcommunity.com/market/priceoverview/?currency=1&appid=730&market_hash_name=Operation%20Breakout%20Weapon%20Case

http://prntscr.com/8lrsdz

Será que ele guarda com este código?

Edited by joka503

Share this post


Link to post
Share on other sites
joka503

Nós estamos a usar um contador de utilizadores mas o problema é que o "echo" não escreve no local definido por nós como se pode ver aqui:

http://prntscr.com/8lzyoy

Página Principal

<?php
$host = "****"; // your MySQL host i.e. the server on which the database is, usually localhost
$user = "****"; // your MySQL username
$db = "****"; // the database to which you're trying to connect to
$fileLoc = $_SERVER['DOCUMENT_ROOT'] . '/passwords.txt';
if (file_exists($fileLoc)) {
 $fh = fopen($fileLoc, 'r');
 $jsonStr = fgets($fh);
 $arr = json_decode($jsonStr, true);
 $dbPass = $arr['default-password'];
 fclose($fh);
} else {
 die('no file found');
}

$conn = mysql_connect("$host", "$user", "$dbPass") or die ("Unable to connect to database.");
mysql_select_db("$db", $conn);
include_once ("usersOnline.class.php");
$visitors_online = new usersOnline();
if (count($visitors_online->error) == 0) {
   if ($visitors_online->count_users() == 1) {
    echo "There is " . $visitors_online->count_users() . " visitor online";
   }
   else {
    echo "There are " . $visitors_online->count_users() . " visitors online";
   }
}
else {
   echo "<b>Users online class errors:</b><br /><ul>\r\n";
   for ($i = 0; $i < count($visitors_online->error); $i ++ ) {
    echo "<li>" . $visitors_online->error[$i] . "</li>\r\n";
   }
   echo "</ul>\r\n";
}
?>

Página Users Online

class usersOnline {
var $timeout = 600;
var $count = 0;
var $error;
var $i = 0;

function usersOnline () {
 $this->timestamp = time();
 $this->ip = $this->ipCheck();
 $this->new_user();
 $this->delete_user();
 $this->count_users();
}

function ipCheck() {
/*
This function will try to find out if user is coming behind proxy server. Why is this important?
If you have high traffic web site, it might happen that you receive lot of traffic
from the same proxy server (like AOL). In that case, the script would count them all as 1 user.
This function tryes to get real IP address.
Note that getenv() function doesn't work when PHP is running as ISAPI module
*/
 if (getenv('HTTP_CLIENT_IP')) {
  $ip = getenv('HTTP_CLIENT_IP');
 }
 elseif (getenv('HTTP_X_FORWARDED_FOR')) {
  $ip = getenv('HTTP_X_FORWARDED_FOR');
 }
 elseif (getenv('HTTP_X_FORWARDED')) {
  $ip = getenv('HTTP_X_FORWARDED');
 }
 elseif (getenv('HTTP_FORWARDED_FOR')) {
  $ip = getenv('HTTP_FORWARDED_FOR');
 }
 elseif (getenv('HTTP_FORWARDED')) {
  $ip = getenv('HTTP_FORWARDED');
 }
 else {
  $ip = $_SERVER['REMOTE_ADDR'];
 }
 return $ip;
}

function new_user() {
 $insert = mysql_query ("INSERT INTO useronline(timestamp, ip) VALUES ('$this->timestamp', '$this->ip')");
 if (!$insert) {
  $this->error[$this->i] = "Unable to record new visitor\r\n";  
  $this->i ++;
 }
}

function delete_user() {
 $delete = mysql_query ("DELETE FROM useronline WHERE timestamp < ($this->timestamp - $this->timeout)");
 if (!$delete) {
  $this->error[$this->i] = "Unable to delete visitors";
  $this->i ++;
 }
}

function count_users() {
 if (count($this->error) == 0) {
  $count = mysql_num_rows ( mysql_query("SELECT DISTINCT ip FROM useronline"));
  return $count;
 }
}
}
?>

Share this post


Link to post
Share on other sites
HappyHippyHippo

como o código claramente não corresponde à imagem apresentada duvido que alguém irá responder a este tópico


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.