2012-10-10, 04:09
|
#1
|
|
Mycket flitig postare
Reg.datum: Oct 2010
Inlägg: 551
|
uppdatera databas med php och javascript
Hejsan, försöker skriva om lite kod på reaplagg.se, bland annat uppladdningen av xml filer (produktlista).
Jag kan verkligen ingenting om javascript, och jag är nybörjare när det gäller php.
Får det hela inte att fungera. Inget händer lixom. Databasen uppdateras inte, men inga felmeddelanden syns heller.
Fälten i databasen blir tomma, om man anger vissa kolumner manuellt vill säga..
Såhär har jag skrivit i ena filen (där man väljer att ladda upp xml fil mm).
PHP-kod:
<?php include('includes/header.php'); if (checkAccess() == false) {header("Location: login.php");}; /* om man är inte inloggad */ ?> <div id="admin-menu"> <div id="menu"> <ul> <li class="hem"><a href="/admin/">Hem</a></li> <li class="produkter current"><a href="produkter.php">Produkter</a></li> <li class="reklam"><a href="ads.php">Reklam</a></li> <li class="sidor"><a href="sidor.php">Sidor</a></li> </ul> </div><!-- menu --> <div class="clear"></div> </div>
<?php if (isset($_POST['submit'])) { $temp_path = $_FILES["file"]["tmp_name"]; ?> <script> function displayResult() { var path = document.getElementById("path").value; var string = "path=" + path; var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("POST","test.php",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send(string); }; </script> <?php }; ?>
<div class="clear"></div> <h2>Lägg till en XML-produktlista</h2>
<form action="" method="post" enctype="multipart/form-data"> Välj en xml fil: <input type="hidden" name="path" value="<?php if (isset($temp_path)) {echo $temp_path;}; ?>" id="path" /> <input type="file" name="file" id="fname" /> <input type="submit" onclick="displayResult()" value="Dubbelklicka för att ladda upp" name="submit" id="submit" /> </form>
<div class="clear"></div> <?php include('includes/footer.php'); ?>
I test.php har jag sedan detta:
PHP-kod:
$path = $_POST['path']; $xml = simplexml_load_file($path);
Tänker mest på att felet ligger i test.php. Går det verkligen att göra på det där viset tro?
Jag har suttit och fulskrivit js koden för att få fram den riktiga adressen till filen, som jag sedan (tror jag?) skickar med i en POST till test.php och hämtar sedan upp den där. Dock så är det i en ren string, kanske det som ställer till det?
Någon som ser något fel, eller vet en lösning? eller kanske en annan version av en lösning?
Tack på förhand!
Senast redigerad av jonssondesign den 2012-10-10 klockan 04:12
|
2012-10-10, 08:17
|
#2
|
|
Flitig postare
Reg.datum: Jun 2010
Inlägg: 358
|
Nu har jag inte testat koden så jag kan inte kolla om JavaScript-koden fungerar, men din test.php gör ingenting, egentligen.
Den hämtar en xml-fil och lagrar den i en variabel. Därefter händer ingenting. Inget som skriver till någon databas någonstans (eller ens några funktioner för detta). Det enda simplexml_load_file gör är att läsa in en xml-fil och lagra in den i en variabel.
|
2012-10-10, 13:05
|
#3
|
|
Klarade millennium-buggen
Reg.datum: Feb 2004
Inlägg: 3 356
|
Du kan inte ladda upp filer med AJAX.
Dock så skulle ditt ajax anrop inte göra något unikt utan snarare göra något "simpelt" mer komplicerat genom att det du kan göra inom IF-satsen gör du i en extern fil med ajax.
1) Dessutom skickar du inte med sökvägen via ajax-anropet.
Skulle du mot all förmodan göra det så skulle jag ställa mig med den röda flaggan och skrika säkerhetshål och blåsa i visselpipan.
2) Du kan inte hämta ut sökvägen i en <input type="file"> eftersom den pekar lokalt på datorn, om du kunde detta skulle du då skicka en lokalsökväg som inte finns åtkomlig till serversidan.
Bättre och trevligare lösning:
PHP-kod:
<?php if (isset($_POST['submit'])) { $xml = simplexml_load_file($_FILES["file"]["tmp_name"]); ... hantera $xml ... } ?>
Detta är så oerhört mycket smidigare än att blanda in ajax.
__________________
9 av 10 PHP problem kan bli lösta genom följande:
Kod:
error_reporting(E_ALL);
ini_set('display_errors', 1);
|
2012-10-10, 13:51
|
#4
|
|
Mycket flitig postare
Reg.datum: Oct 2010
Inlägg: 551
|
Tack för era bådas kommentarer!
Såhär ligger det till:
Gregoff: Jag har för mycket kod i test.php för att vilja skriva ut allt. Men jag vet att detta fungerar, eftersom att jag har gjort precis som Jonas skrev.
Jonas: Jag har gjort precis som du skrev tidigare, så jag vet att det är mycket enklare.
Problemet och skälet varför jag vill använda mig av ajax är för att det tar för lång tid att ladda upp produkterna, vilket gör att, på vissa webbhotell (city network), så får jag en 505 error. (jag får inte det på binero).
Jag kan visa hur jag har gjort tidigare:
PHP-kod:
<?php include('includes/header.php');
if (checkAccess() == false) {header("Location: login.php");}; /* om man är inte inloggad */
?>
<div id="admin-menu">
<div id="menu">
<ul>
<li class="hem"><a href="/admin/">Hem</a></li>
<li class="produkter current"><a href="produkter.php">Produkter</a></li>
<li class="reklam"><a href="ads.php">Reklam</a></li>
<li class="sidor"><a href="sidor.php">Sidor</a></li>
</ul>
</div><!-- menu -->
<div class="clear"></div>
</div>
<?php
if (isset($_POST['submit'])) { // när man klickar på OK knappen
if (!empty($_FILES["file"]["name"])) {
if (!empty($_POST['store'])) {
$allowedExts = array("xml");
$array = explode(".", $_FILES["file"]["name"]);
$extension = $array['1'];
if (($_FILES["file"]["type"] == "text/xml") && in_array($extension, $allowedExts)) {
if ($_FILES["file"]["error"] <= 0) {
$filed_store = $_POST['store']; // Hämtar datan ur radio-knapparna
if ($filed_store == "nelly") { // om man valt nelly
include('xml_upload_nelly.php');
} elseif ($filed_store == "ellos") { // om man valt ellos
include('xml_upload_ellos.php');
} else {$message = "Det verkar som om du har valt <strong>fel butik till xml filen</strong>. Kontrollera en extra gång så att xml filen tillhör " . $filed_store . ".";};
} else { $message = "Error: " . $_FILES["file"]["error"]; };
} else { $message = "Det verkar som om filen du försöker använda inte är en xml fil."; };
} else { $message = "Du måste välja någon av de ovanstående butikerna."; };// om någon av radio knapparna är ifyllda
} else { $message = "Du måste välja en xml fil att ladda upp."; };
};
?>
<div class="clear"></div>
<h2>Lägg till en XML-produktlista</h2>
<div id="progress"></div>
<form action="" method="post" enctype="multipart/form-data" id="xml_form">
<label for="file" id="for_file">Välj xml fil</label> <span id="label_for"></span> <input type="file" name="file" id="file" />
<div class="clear"></div>
<div class="clear"></div>
<div id="xml_stores">
<div class="xml_box"><input type="radio" name="store" value="nelly" class="xml_store" /> <span>Nelly</span></div>
<div class="xml_box"><input type="radio" name="store" value="ellos" class="xml_store" /> <span>Ellos</span></div>
<div class="clear"></div>
</div>
<input type="submit" name="submit" value="Ladda upp" id="submit_xml" /> <?php if (isset($message)) {echo "<div class=\"xml_message\">" . $message . "</div>";}; ?>
</form>
<div class="clear"></div>
<?php include('includes/footer.php'); ?>
xml_upload_nelly.php
PHP-kod:
<?php
$xml_file = $_FILES["file"]["tmp_name"];
$xml = simplexml_load_file($xml_file);
$query = "UPDATE products SET fresh = 0";
$update = mysql_query($query);
foreach($xml->product as $product){
set_time_limit(0);
$categori = $product->fields->productGroup;
$gender = $product->fields->gender;
if (empty($categori) || !isset($categori)) {$categori = "-";};
if (
$gender == "Kille" ||
$gender == "Tjej" ||
$gender == "Unisex" ||
$gender == "Mamma") {} // om $gender innehåller "kille, tjej, unisex eller mamma", gör inget
elseif ($categori == "Baddräkter" ||
$categori == "Bikinis" ||
$categori == "Blusar & skjortor" ||
$categori == "Byxor" ||
$categori == "Byxor & shorts" ||
$categori == "Festklänningar" ||
$categori == "Jackor" ||
$categori == "Jeans" ||
$categori == "Jumpsuit" ||
$categori == "Kjolar" ||
$categori == "Klänningar" ||
$categori == "Leggings" ||
$categori == "Linnen" ||
$categori == "Shorts" ||
$categori == "Sport bh" ||
$categori == "Strandplagg" ||
$categori == "T-shirts" ||
$categori == "Toppar" ||
$categori == "Tröjor" ||
$categori == "-") // om $categori innehåller "något av ovanstående", gör inget
{
if ($product->fields->sale == "true") {
$img = mysql_real_escape_string($product->fields->extraImageProductLarge);
$title = mysql_real_escape_string($product->name); if ($title == "") {$title = "-";};
$brand = mysql_real_escape_string($product->brand); if ($brand == "") {$brand = "-";};
$store = "Nelly";
$price = mysql_real_escape_string($product->price); if ($price == "") {$price = "-";};
$url = mysql_real_escape_string($product->productUrl);
$category = mysql_real_escape_string($categori); if ($category == "") {$category = "-";};
$gender = mysql_real_escape_string($product->fields->gender); if ($gender == "") {$gender = "-";};
$info = mysql_real_escape_string($product->description); if ($info == "") {$info = "-";};
$xml_url = $product->advertiserProductUrl;
$new_xml_url_without = substr($xml_url, 7);
$new_xml_url = urlencode($new_xml_url_without);
$delete_url = array("%2F");
$replace_url = array("/");
$new_url_function = str_replace($delete_url, $replace_url, $new_xml_url);
$advertiserProductUrl = "http://" . $new_url_function;
$query = "INSERT INTO products (img, title, brand, store, price, url, category, gender, visible, info, advertiserProductUrl, fresh, new) VALUES ";
$query .= "('$img', '$title', '$brand', '$store', $price, '$url', '$category', '$gender', 1, '$info', '$advertiserProductUrl', 1, 1) ";
$query .= "ON DUPLICATE KEY UPDATE fresh = 1";
$insert = mysql_query($query) or die (mysql_error());
};
};
};
$query = "SELECT id, advertiserProductUrl FROM products WHERE `new` = 1";
$select = mysql_query($query) or die(mysql_error());
while ($result = mysql_fetch_array($select)) {
set_time_limit(0);
$url = $result['advertiserProductUrl'];
$id = $result['id'];
$org_price = getOrgPrice($url);
if (!empty($org_price)) {
$query = "UPDATE `products` SET `org_price`=$org_price,`new`=0 WHERE id = $id";
$insert = mysql_query($query) or die (mysql_error());
};
};
$query = "DELETE FROM products WHERE fresh = 0";
$delete = mysql_query($query) or die(mysql_error());
$message = "<strong>Super!</strong> Allt fungerade som det skulle, och databasen är nu uppdaterad med nya produkter från <strong>". $filed_store . "</strong>.";
?>
Detta fungerar kanon, bara att det tar för lång tid. Ibland så överstiger webbläsarens minne, och man får börja om (göra en refresh och skicka med den datan man valt i formuläret igen).
Ibland så tar det för lång tid, så att man får 505 error (händer bara på city network).
Så det jag strävade efter egentligen, var att hitta ett sätt där uppladdningen (xml_upload_nelly.php) sköts bakom stängda dörrar, så att webbläsaren slipper jobba medans koden körs.
Förstod ni?
PS. test.php innehöll samma kod som xml_upload_nelly.php innehåller, förutom att $xml_file = $_FILES["file"]["tmp_name"]; byttes ut mot $path = $_POST['path'];
|
2012-10-10, 17:38
|
#5
|
|
Medlem
Reg.datum: Nov 2003
Inlägg: 181
|
Undvik Ajax för detta som nämnts.
Även om du får det att funka, tänk på att då körs det asynkrona requesten i bakgrunden och kanske timar ut, vilket ju verkar hända i detta fall ibland,
utan att man får reda på att den "failat" eller man kanske stänger ner webbläsaren under tiden.
Men kolla på jquery plugins som har progress indikatorer m.m..om du ändå vill köra ajax
|
2012-10-10, 20:04
|
#6
|
|
Mycket flitig postare
Reg.datum: Oct 2010
Inlägg: 551
|
jo precis. Tänkte det jag med.
Men frågan är, hur får jag iväg filen man laddar upp till test.php?
Någon som vet?
Jag vill inte ladda upp själva filen och spara i någon mapp, utan jag använda den webbläsarbaserade versionen av filen helst, så slipper man vänta i typ 5 minuter bara på att den ska laddas upp lixom, och sen läsas av.
|
2012-10-11, 00:40
|
#7
|
|
Klarade millennium-buggen
Reg.datum: Feb 2004
Inlägg: 3 356
|
Uppenbarligen så är XML filen stor, du sparar både den och dess objekt i minnet.
Så beroende på hur servern är konfigurerad (memory_limit) så kommer detta att resultera i fel. Likaså timeout på scriptet.
Jag skulle råda dig i att stycka upp filen. Kan vara allt från att du lagrar informationen i omgångar till att köra xx antal rader åt gången.
Testa till exempel att skriva ut data emellanåt samt att se till att variabler återanvänds/NULL:as när dom inte längre används.
Har du tex det så här:
PHP-kod:
$xml = simplexml_load_file(...); // 50MB stor fil $rows = $data = $xml;
Så förbrukar du 150MB. Nu är det lite extremt men vill få fram en poäng.
Titta även på att köra MySQL frågorna med multiple inserts istället en fråga per iteration. Tex.
PHP-kod:
$insert = 'INSERT INTO table (field1, field2, field3, ...) VALUES '; $sql = ''; $x = 0; while(...) { $x++; ...
$sql .= ', (id, value, name, ...)';
if($x == 150) { $query = $insert . substr($sql, 1); // Substr tar bort första komma-tecknet. mysql_query($query); $query = $sql = ''; // Nollställ variablar $x = 0; } } // Viktig - lägg in de sista posterna $query = $insert . substr($sql, 1); // Substr tar bort första komma-tecknet. mysql_query($query);
__________________
9 av 10 PHP problem kan bli lösta genom följande:
Kod:
error_reporting(E_ALL);
ini_set('display_errors', 1);
|
2012-10-11, 01:14
|
#8
|
|
Mycket flitig postare
Reg.datum: Oct 2010
Inlägg: 551
|
Tack! Ska testa lite.
Mina filer är faktiskt på runt 30 - 70mb (produktlistor från nelly och ellos från tradedoubler). Man kan, om man vill, skräddarsy sin produktlista (välja vilka "kolumner?" som ska vara med i xml filen, då kan den blir några mb mindre, men det är inte alltid det går - man kanske vill ladda ner en annans butiks xml fil från annat affiliate sida).
Som sagt, ska kolla lite på detta. Tack!
|
2012-10-11, 01:21
|
#9
|
|
Klarade millennium-buggen
Reg.datum: Feb 2004
Inlägg: 3 356
|
En annan, mer ren kodoptimering är att köra switch() istället för if().
switch() är "snabbare" än if() i ren optimering, samt gör koden mer läsbar.
"continue" hoppar över hela iterationen och påbörjar nästa istället.
PHP-kod:
switch ($gender) { case"Kille": case "Tjej": case "Unisex": case "Mamma": continue; // om $gender innehåller "kille, tjej, unisex eller mamma", gör inget } switch ($categori) { case "Baddräkter": ... case "-": // om $categori innehåller "något av ovanstående", gör inget continue; }
__________________
9 av 10 PHP problem kan bli lösta genom följande:
Kod:
error_reporting(E_ALL);
ini_set('display_errors', 1);
|
2012-10-11, 04:01
|
#10
|
|
Klarade millennium-buggen
Reg.datum: Aug 2005
Inlägg: 4 246
|
Min fråga är varför du inte bearbetar data lokalt i din lokala databas innan du skickar upp informationen?
Om du gör:
Kod:
INSERT Into NyTabell ( col1, col2, col3... )
SELECT col1, col2, col3...
FROM GammalTabellen
WHERE gender in (select gender from GenderTabellen)
... så kommer du bara få med det data som du vill ha från början och det reducerar mer eller mindre hela behovet av att ha en massa komplex logic i din PHP-kod... Eller är det något jag har missat i kravbilden?
__________________
Senior Backend Systemutvecklare (sedan 1988) med inriktning mot Microsoft .NET (C#, VB.NET, C, C++, J# och F#) , men även en del Java SE samt databasmodellering i SQL-server. Konsultar.
--> Höjden av optimism - Det är att utrusta en programmerare med kulspetspenna! <--
Senast redigerad av ConnyWesth den 2012-10-11 klockan 04:04
|
|
Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
|
|
|
| Ämnesverktyg |
|
|
| Visningsalternativ |
Linjär visning
|
Regler för att posta
|
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg
HTML-kod är av
|
|
|
Alla tider är GMT +2. Klockan är nu 10:24.
| |
|