PHP MYSQL LIKE Command

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jaimy A

Jaimy A

18/12/2014 18:14:41
Quote Anchor link
hallo allemaal,

Ik loop een beetje vast met het volgende,
Ik heb een mysql tabel met data:
Adcount_Input
Afbeelding

Code die ik nu al heb:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$Count_Stock
= "SELECT * FROM Adcount_input";
$result = mysql_query($Count_Stock) or die(mysql_error());

while($row = mysql_fetch_array($result)) {
$framemaat = preg_replace('/\D/', '', $row['framemaat']); // Enkel cijfers graken door deze filter
$ean13 = $row['ean13'];
mysql_query("INSERT IGNORE INTO Adcount_output(ean13) VALUES('$ean13')") or die(mysql_error());

    $Count_frames = "SELECT count(*) FROM Adcount_input WHERE ean13='$ean13' LIKE '%$framemaat%' ";
    $result = mysql_query($Count_frames) or die(mysql_error());

    $row = mysql_fetch_row($result);
    // Should show you an integer result.
    echo $row[0].'<br />';
}
?>


1 -> Verbinding met Adcount_input
2 -> Weergeef enkel cijfers die zich in kolom "framemaat" bevinden door middel van preg_replace
3 -> Controleer of "Adcount_input.ean13" al wordt weergeven in "Adcount_output.ean13"
4 -> Indien 3 = negatief -> INSERT Adcount_output.ean13

Nu is het de bedoeling dat ik de frame maten groepeer en tel.
TrekT80J15 45CM = (3)
TrekT80J15 50CM = (2)
TrekT80J15 55CM = (1)

KogaEdeluxe15 45CM = (2)
KogaEdeluxe15 50CM = (2)

Hier voor wou ik gebruik maken van de volgende code (zie code hierboven):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$Count_frames
= "SELECT count(*) FROM Adcount_input WHERE ean13='$ean13' LIKE '%$framemaat%' ";
[
/code]?>


bedoeling is dat ik in Adcount_output een tabel krijg zoals voorbeeld:
Afbeelding

eventjes alles samengevat:

Ik probeer de data van Adcount_input te verplaatsen naar Adcount_output
Terwijl dit gebeurt moet de data "framemaat" gegroepeerd worden per framemaat
en geteld worden hoeveel ik heb van elke framemaat.
en dit allemaal moet in Adcount_Output worden opgeslagen
Gewijzigd op 18/12/2014 18:28:54 door Jaimy A
 
PHP hulp

PHP hulp

22/12/2024 09:06:04
 
Mathieu Posthumus

Mathieu Posthumus

18/12/2014 18:33:30
Quote Anchor link
Als je het wil wil nummeren kun je toch beter een for loop gebruiken zou ik denken?
 
Jaimy A

Jaimy A

18/12/2014 18:44:14
Quote Anchor link
lukt dit niet in een while? zoals bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
while($row = mysql_fetch_array($result)) {
$framemaat = preg_replace('/\D/', '', $row['framemaat']); // Enkel cijfers graken door deze filter
$ean13 = $row['ean13'];
mysql_query("INSERT IGNORE INTO Adcount_output(ean13) VALUES('$ean13')") or die(mysql_error());


    $framecounter = 0;
    $Count_frames = "SELECT * FROM Adcount_input WHERE ean13='$ean13' LIKE '$framemaat' ";
    while($row = mysql_fetch_array($Count_frames)) {
    $framecounter++;
    $row['framemaat'];
    }

    echo $ean13.'('.$framemaat.')'.' = '.$framecounter.'<br />';
}

?>
Gewijzigd op 18/12/2014 18:46:59 door Jaimy A
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/12/2014 18:49:48
Quote Anchor link
een string uit elkaar rafelen is altijd veel minder makkelijk dan een string samenstellen.

Conclusie: haal al die cm en c/c er uit en maak die kolom van het type integer. Indien je per se bij de ene cm en bij de andere c/c wilt vermelden dan maak je daar een nieuwe kolom voor aan. Verder tevens het advies om een tabel framematen te maken en de gebruiker bij het invoeren enkel een dropdown voor de neus te zetten zodat zij verplicht een bestaande framemaat moeten selecteren.
Gewijzigd op 18/12/2014 18:50:26 door Frank Nietbelangrijk
 
Jaimy A

Jaimy A

18/12/2014 20:53:13
Quote Anchor link
@frank
heb u conclusie een beetje gevolgd, heb eerst een sql uitgevoerd die de data herschrijft zonder cm , c/c, ...

en dan heb ik mijn code volledig herschreven. wat vinden jullie hiervan ? kan het sneller ? veilger? eenvoudiger? het werkt in elk geval al wel

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$get_input
= "SELECT * FROM Adcount_input";
$result_input = mysql_query($get_input) or die(mysql_error());

while($input_row = mysql_fetch_array($result_input)) {
$ean13 = $input_row['ean13'];
$framesize = $input_row['framemaat'];

    $get_frame = "SELECT count(framemaat) AS aantal FROM Adcount_input WHERE framemaat = '$framesize' AND ean13 = '$ean13' ";
    $result_frame = mysql_query($get_frame) or die(mysql_error());
    
    while($frame_row = mysql_fetch_array($result_frame)) {
    $frame_quantity = $frame_row['aantal'];
            
        $get_attribute = "SELECT * FROM shop_product_attribute WHERE ean13 = '$ean13' AND upc = '$framesize' ";
        $result_attribute = mysql_query($get_attribute) or die(mysql_error());
        
        while($attribute_row = mysql_fetch_array($result_attribute)) {
        $attribute_id = $attribute_row['id_product_attribute'];
        echo 'EAN13:'.$ean13.' FRAMESIZE:'.$framesize.' ATTRIBUTE_ID:'.$attribute_id.' FRAMEQUANTITY:'.$frame_quantity.'<br />';
        
        mysql_query("UPDATE shop_stock_available SET quantity='$frame_quantity' WHERE id_product_attribute = '$attribute_id'")
        or die(mysql_error());    
        
        }            
    }    
}


?>
Gewijzigd op 18/12/2014 20:53:54 door Jaimy A
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

18/12/2014 22:06:11
Quote Anchor link
In plaats van 3 query's op het resultaat van een andere query in een lus, kan je dit met één query af.

Om te beginnen gaan we de aantallen in één keer ophalen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    p.id_product_attribute,
    p.ean13,
    p.upc,
    COUNT(*) amount
FROM
    shop_product_attribute p
JOIN
    Adcount_input a
    ON p.ean13 = a.ean13 AND p.upc = a.framemaat
/* eventuele where */
GROUP BY p.id_product_attribute, p.ean13, p.upc

Wat je waarschijnlijk niet weet is dat je met een update ook joins kan gebruiken, dus gaan we bovenstaande als een subquery (virtuele tabel) in de update plaatsen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
UPDATE shop_stock_available s
JOIN (
    SELECT
        p.id_product_attribute,
        p.ean13,
        p.upc,
        COUNT(*) amount
    FROM
        shop_product_attribute p
    JOIN
        Adcount_input a
        ON p.ean13 = a.ean13 AND p.upc = a.frame_maat
    /* eventuele where */
    GROUP BY p.id_product_attribute, p.ean13, p.upc
    ) q
    USING (id_product_attribute)
SET
    s.quantity = q.amount
Gewijzigd op 18/12/2014 22:23:42 door Ger van Steenderen
 
Jaimy A

Jaimy A

19/12/2014 12:45:56
Quote Anchor link
@gert

Wow is zoveel korter dan mijn code :D moet ik mij later eens in verdiepen hoe dit juist in zijn werk gaat.

@gert
U code werkt buiten dat je frame_maat had getypt indeplaats van framemaat klopte het volledig.
Is dit de juist manier om dit te laten loopen of is een loop niet nodig en is een mysql_insert voldoende ?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$get_input
= "UPDATE shop_stock_available s
JOIN (SELECT p.id_product_attribute, p.ean13, p.upc, COUNT(*) amount FROM shop_product_attribute p
    JOIN Adcount_input a ON p.ean13 = a.ean13 AND p.upc = a.framemaat
    GROUP BY p.id_product_attribute, p.ean13, p.upc) q
    USING (id_product_attribute) SET s.quantity = q.amount "
;     
$result_input = mysql_query($get_input) or die(mysql_error());
while($input_row = mysql_fetch_array($result_input)) { }
?>


EDIT:
je code werkt dus zo als ik het goed voorheb:
"UPDATE shop_stock_available s
s is de nieuwe naam voor shop_stock_available
waardoor je een colom die in shop_stock_available staat kunt oproepen zoals bijvoorbeeld:
s.quantity
Gewijzigd op 19/12/2014 12:48:31 door Jaimy A
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

19/12/2014 20:16:58
Quote Anchor link
Klopt, dat heet een alias en helemaal volledig is het met AS ervoor. Je hoeft dan niet telkens de gehele tabelnaam in te geven bij het aangeven van de kolommen.

Het is een update query, dus je krijgt true of false terug dus je zou eigenlijk een foutmelding moeten krijgen, want dat is boolean en geen pointer naar een recordset.

DE code is niet alleen korter maar stukken efficiënter.
Stel dat Adcount_input 500 rijen bevat dan voer je 1500 queries meer uit ....
 
Jaimy A

Jaimy A

23/12/2014 13:04:26
Quote Anchor link
opgelost*
Gewijzigd op 23/12/2014 22:25:04 door Jaimy A
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.