Problem mit UPDATE von SQL Werten

raybrackho

Mitglied
Ich habe ein kleines Script für mein Shopping-System Open Cart.

Code:
<?php
require_once('config.php');
require_once(DIR_SYSTEM . 'startup.php');

// Registry
$registry = new Registry();

// Loader
$loader = new Loader($registry);
$registry->set('load', $loader);

// Config
$config = new Config();
$registry->set('config', $config);

// Database 
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
$registry->set('db', $db);

$query = $db->query("SELECT DISTINCT email, customer_id as cid FROM `" . DB_PREFIX . "order` WHERE customer_id > 0");

foreach ($query->rows as $row){
	$query2 = $db->query("UPDATE `" . DB_PREFIX . "order` SET customer_id = '". (int)$row['cid'] ."' WHERE LCASE(email) = '".strtolower($row['email'])."'");
}
	
echo 'done';
?>

Hierbei sollen Kunden, die erst ein Bestellung aufgegeben haben und erst später ein Konto eingerichtet haben die Möglichkeit bekommen auf ihre alten Bestellungen zurückzugreifen.
Leider funktioniert es nicht.

Es kommen aber auch keine Fehler.

Sieht irgendwer wo hier der Wurm steckt****
 
Hmm, macht es wirklich Sinn, nach Datensätzen zu suchen, die eine Kundennummer haben, wenn man eigentlich Datensätze sucht, die keine Kundennummber haben (weil kein Kundenkonto vorhanden)? Und vor allem, warum durchsucht man irgendwie alle Datensätze? Ist das nicht etwas heikel, wenn man die Einkäufe von anderen Kunden in seinem Profil betrachten kann?

EDIT: Beim Update wird "(int)$row['cid']" verwendet, aber selektiert wird oberhalb email und customer_id. Es sollte also zu mindest mal (int)$row['customer_id'] heißen, oder?
 
Zuletzt bearbeitet:
Sehe ich das richtig das du beim Update die eMail Adresse als Filterkriterium nimmst?

Dann solltest du das doch mit einer Abfrage lösen können und nicht mit 2 Abfragen und einer FOREACH-Schleife.

Oder verstehe ich mal wieder was falsch!?
 
also das script wurde mir freundlicherweise zur verfügung gestellt. meine sql kenntnisse sind nur rudimentär.

@saftmeister: das hatte mich ehrlich gesagt auch schon gewundert
Code:
customer_id > 0
die stelle meinst du sicherlich, oder?

also das script sollte bestenfalls so funktionieren:

-gucken welche bestellungen customer_id=0 haben
-von diesen bestellungen die email adressen nehmen
-kunden, die die gleiche mail verwenden die "alte" bestellung anhängen (also der alten bestellung statt customer_id 0 die customer_id des kundenkontos geben)

EDIT:
@Saftmeister:
Code:
customer_id as cid
"cid" wird ja oben deklariert
 
Zuletzt bearbeitet:
Ich würde die Email-Adresse als einziges Kriterium ansehen, was auch schon tombe geschrieben hat und nur ein Query absetzen:

PHP:
$query2 = $db->query("UPDATE `" . DB_PREFIX . "order` SET customer_id = '". (int)$row['cid'] ."' WHERE LCASE(email) = '".strtolower($email)."'");

Wobei $email aus dem aktuell angemeldeten (oder frisch angelegten) Kunden-Datensatz kommen muss, den man evtl. über Session-Variable bekommt. Wird dieser Code direkt nach dem Anlegen des neuen Benutzer-Kontos ausgeführt?
 
also wenn ich
Code:
echo "{$query}\n";
mysql_query($query) or die(mysql_error());
unter mein query setze, kommt folgender Fehler:
Code:
Catchable fatal error: Object of class stdClass could not be converted to string in .../html/runonce_v2.php on line 25
 
Wenn man noch von obigem Code ausgeht, dann dürfte Zeile 25 wohl diese hier sein:

PHP:
$query = $db->query("SELECT DISTINCT email, customer_id as cid FROM `" . DB_PREFIX . "order` WHERE customer_id > 0");

und das kannst du nicht mit echo ausgeben.

Wenn du die SQL-Anweisung ausgeben willst, dann musst du eine Variable zwischenschalten:

PHP:
$sql = "SELECT DISTINCT email, customer_id as cid FROM `" . DB_PREFIX . "order` WHERE customer_id > 0";

$query = $db->query($sql);

echo $sql;
 
Zurück