Avatar billede NielsErikP Mester
10. februar 2013 - 01:27 Der er 20 kommentarer og
1 løsning

PHP/MYSQLI -- Unexpected T_OBJECT OPERATOR ....

Hej...

Er lige gået igang med Mysqli med prepared statement, men jeg får følgende fejl :

    "Parse error: syntax error, unexpected T_OBJECT_OPERATOR in C:\xampp\htdocs\cd_mysqli.php on line 13
"


Min fil ser sådan ud :


<?php
   
    $mysqli = new mysqli("localhost", "root", "", "musik_kartotek");
   
   
    // tjek forbindelse til Database ....
    if (mysqli_connect_errno() ){
        echo "Forbindelse ikke etableret" . mysqli_connect_error() ;
        exit;
    }

    // opret en "PREPARED STATEMENT" ...
    if ($stmt = mysqli->prepare(INSERT INTO cd_holder (kunster_navn, album_navn, udgivelse_aar, tracks, produced_by, mixed_by, company) VALUES (?, ?, ?, ?, ?, ?, ?) ) ){

            // Bind parametrene ...
            $stmt-> bind_param('ssiisss', $kunster_navn, $album_navn, $udgivelse_aar, $tracks, $produced_by, $mixed_by, $company);

            // Sæt parametrene ...
            $kunster_navn = "Poison";
            $album_navn = "Look what the cat dragged in";
            $udgivelse_aar = "1986";
            $tracks = "10";
            $produced_by = "Ric Browde";
            $mixed_by = "Michael Wagener";
            $company ="Music Grinder Studios, Hollywood California";
           
            //Eksekver den "PREPARED STATEMENT" ...
            $stmt->execute();
           
            //Udskriv , hvad der er indsat i Databasen ....
            echo '$kunster_navn\n' .'$album_navn\n'. '$udgivelse_aar\n' . '$tracks\n' . '$produced_by\n' . '$mixed_by\n' . '$company\n' . 'Er indsat i Databasen';

            // Lukke den "PREPARED STATEMENT" ....
            $stmt-> close();
           
    }
    else {
        echo "Prepared statement fejl: " . $mysqli->error;
    }
?>



Og linje 13.. Er denne :


// opret en "PREPARED STATEMENT" ...
    if ($stmt = mysqli->prepare(INSERT INTO cd_holder (kunster_navn, album_navn, udgivelse_aar, tracks, produced_by, mixed_by, company) VALUES (?, ?, ?, ?, ?, ?, ?) ) ){



Nogen der kan rette mig ind på sporet.

På forhånd tak.
Avatar billede olebole Juniormester
10. februar 2013 - 01:40 #1
<ole>

if ($stmt = $mysqli->prepare(INSERT ...

/mvh
</bole>
Avatar billede olebole Juniormester
10. februar 2013 - 01:42 #2
- og så skal du escape din SQL-sætning med gåseøjne/apostroffer  =)
Avatar billede whatslife Nybegynder
10. februar 2013 - 10:53 #3
Bare lige et hurtigt indspark af flueknepperi men du har flere steder skrevet "kunster"
jeg går ud fra at der skulle have stået "kunstner"
Avatar billede NielsErikP Mester
10. februar 2013 - 11:33 #4
Hej...

Tusind tak,Ole.. Altid en fornøjelse at møde dig "Smiler"
Ved ikke om det gør noget, men jeg prøver lige at få stillet min lyst... Er lige gået igang med mysqli m. prepared stat. Det fiser lidt rundt under kasketten på mig, hvornår man bruger bind_result frem for bind_param og omvendt.

@whatslife: Ser du er enig med ole i jeg ikke kan stave, som ole siger har jeg jo også svært ved at stave til dollar . ;-)
Avatar billede olebole Juniormester
10. februar 2013 - 18:07 #5
Jaja, ingen kunstner uden kunster ... og det kræver en meget stor kunstner at lave kunster med kunstige dollar! Eller skal jeg mon bare prøve at skrive noget, der giver mening?  :D

Det kan godt være lidt forvirrende at overgå til MySQLI. Jeg prøvede på et tidspunkt med denne forklaring, som hjalp en anden bruger:

I MySQL-API'et sender man en kommando til databasen i form af en SQL-streng, som indeholder hele funktionaliteten, som skal udføres.

En streng kan ikke afvikles - det kræver, den bliver konverteret til en 'funktionsagtig ting'. Det kender du fra JavaScript i form af eval. Eval anses som bekendt som værende ekstremt farlig - ikke mindst, hvis strengen er strikket sammen af brugerinput.

Under MySQLI opretter du med prepare en funktion på databasen - en funktion, næsten som du kender den fra JS/PHP.

Når du vil kalde denne funktion, foregår det ikke med ét kald. Kaldet er delt op i to hug:

1) Send argumenter/parametre til funktionen (bind_param[b])

[b]2)
Eksekver funktionen med de sendte argumenter/parametre (execute)

Kaldet er opdelt i disse to handlinger, men der er stadig kun tale om ét kald til funktionen, du oprettede med prepare.

Når kaldet er udført, ligger resultatet så at sige og skvulper rundt inde i funktionen uden at kunne komme ud. Resultatet mangler et fartøj at sejle ud af funktionen med.

Derfor sender du nogle tomme variabler til funktionen med bind_result. Nu har det stakkels resultat noget at putte sig ned i, når det skal transporteres ud af funktionen.

Jeg håber denne lille omskrivning af virkeligheden hjalp lidt  =)

Det kan være lidt forvirrende, at man somme tider bruger ordet argument og somme tider parameter for én og samme ting.

Som jeg har forstået det, brugtes de oprindeligt således, at argument blev brugt fra afsenderens/kalderens point-of-view - mens parameter blev brugt, når man betragtede funktionen indefra:

function fooBar($baz) {
    echo $baz; // $baz er en/et parameter
}

fooBar('HeyHop'); // 'HeyHop' er et argument

- men i daglig tale bruges de to i flæng, ligesom 'daglig tale' er afhængig af den jargon, brugerne af et bestemt programmeringssprog fører. Det er min erfaring, at man oftere hører JS-folk bruge argument end Java-folk, som foretrækker parameter - uanset, hvorfra situationen betragtes.
Avatar billede arne_v Ekspert
10. februar 2013 - 20:03 #6
Man kan faktisk se forskellen med SQL indtastet i MySQL CLI:

mysql> SELECT f1,f2 FROM t1 WHERE f1=2;
+----+------+
| f1 | f2  |
+----+------+
|  2 | BB  |
+----+------+
1 row in set (0.02 sec)

mysql>
mysql> PREPARE av FROM 'SELECT f1,f2 FROM t1 WHERE f1=?';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> SET @f1=2;
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE av USING @f1;
+----+------+
| f1 | f2  |
+----+------+
|  2 | BB  |
+----+------+
1 row in set (0.00 sec)

mysql> DEALLOCATE PREPARE av;
Query OK, 0 rows affected (0.00 sec)
Avatar billede olebole Juniormester
10. februar 2013 - 20:37 #7
@Arne: Det er da en tydelig måde at vise forskellen på. Jeg tror faktisk aldrig, jeg har kørt en prepare kommando gennem en command line, så det har jeg slet ikke tænkt på  =)
Avatar billede arne_v Ekspert
10. februar 2013 - 20:48 #8
Jeg har heller aldrig brugt det - jeg vidste bare at muligheden var der.

mysqli bruger ikke nogle hemmelige features til at lave prepared statement med.
Avatar billede olebole Juniormester
10. februar 2013 - 20:54 #9
Nej, MySQLI er jo blot et API, der hiver fat i databasens features. Jeg havde bare ikke tænkt på, at en command prompt jo skriver disse 'mellemregninger' ud. Godt tænkt!  *o)
Avatar billede NielsErikP Mester
10. februar 2013 - 21:46 #10
Hej..

Som før sagt altid rart at møde dig, ole..
Er du begyndt at samle, smider du så ikke lige et svar?


#6: jaja... Trøster mig med at man jo skal starte et sted, så vender lige tilbage til denne tråd, når jeg forstå dette.
Men tak for venligheden :-)
Avatar billede olebole Juniormester
10. februar 2013 - 22:27 #11
Selvtak - men jeg samler stadig ikke  =)

Til gengæld kogte Arne lige hele 'mit lange essay' ned til nogle ganske få, sigende linjer i en kommando prompt. Det fortjener efter min mening point.

Pointen i Arne's eksempel er at vise den todelte måde, hvorpå man kalder funktionen, som oprettes af prepare kommandoen.

Den første blok udgør en helt almindelig MySQL-kommando, som med det samme resulterer i et ... nåja, resultat: "1 row in set (0.02 sec)".

I den efterfølgende blok opretter han i stedet et prepared statement. Det medfører ikke et resultat: "Query OK, 0 rows affected (0.00 sec)".

I den efterfølgende blok sætter han en parameter med "mysql> SET @f1=2;". Det er det samme, som du gør, når du bruger bind_param. Heller ikke dette medfører noget resultat: "Query OK, 0 rows affected (0.00 sec)".

Først, når han eksekverer funktionen med execute, fremkommer der et resultat: "1 row in set (0.00 sec)".

Den sidste linje: "mysql> DEALLOCATE PREPARE av;" er 'bare' det samme, du gør med $stmt->close(); - og som jo heller ikke bibringer noget resultat.

Ganske illustrativt og noget, jeg helt sikkert kommer til at linke til i fremtiden  =)
Avatar billede olebole Juniormester
10. februar 2013 - 22:34 #12
@Arne: Hvis du lægger et svar, kan du så ikke i samme hug af- eller bekræfte 'tesen' om oprindelig scope-/kontekstafhængighed i forbindelse med 'argument' og 'parameter'?
Avatar billede arne_v Ekspert
10. februar 2013 - 23:01 #13
Jeg mener at det er korrekt at man nogen gange skelner mellem argument og parameter som:

argumenter i kalder

parametre i kaldte

Det er ogsaa den definition som Wikipedia bruger:
  http://en.wikipedia.org/wiki/Argument_%28computer_science%29#Parameters_and_arguments
Avatar billede arne_v Ekspert
10. februar 2013 - 23:02 #14
Og ingen point til mig her, da jeg ikke har vaeret involveret i det egentlige spoergsmaal.
Avatar billede NielsErikP Mester
10. februar 2013 - 23:06 #15
Hej..

Det er squ iiiorden, ole.. Så deler jeg dine point ud til Arne.. nu da du er så venlig at oversætte hans eksempel..
arne_v smider du lig et svar?

Hvor gemmer du dog alle de links og tidligere indlæg og eksempler henne, ole.. Der må være fyldt godt op!!

Tak for hjælpen til jer begge.
Avatar billede NielsErikP Mester
10. februar 2013 - 23:16 #16
Hej...

Du får pointene,arne.. læg venligst et svar :-)
Avatar billede olebole Juniormester
11. februar 2013 - 00:50 #17
@Arne: Tak. Selvom den ikke udtrykker hele kompleksiteten, synes denne sætning (fra Wikipedia) at være et meget godt destillat: "Loosely, a parameter is a type, and an argument is an instance".

#15: Jeg har adskillige mapper i min browsers favoritter med forskellige guldkorn. Har jeg ikke gent siden, vil en søgning à la: "olebole arne_v mysqli command prompt site:eksperten.dk" sikkert ret hurtigt kunne bibringe et link - evt. indsnævret til 'indenfor et år', eller hvad det nu måtte være siden  =)

#14 + #16: Så lægger du bare selv et svar og accepterer det  *o)
Avatar billede arne_v Ekspert
11. februar 2013 - 01:28 #18
Jeg gemmer alle de stumper kode jeg laver til spoergsmall paa E.

Status dags dato: 5712 filer.
Avatar billede olebole Juniormester
11. februar 2013 - 01:54 #19
*ROTFL* Du har 914(!) sider, hver med 20 tråde under besvarede spørgsmål, så det bliver selvfølgelig til en del filer, når man gemmer alle snippets  *D
Avatar billede olebole Juniormester
11. februar 2013 - 01:57 #20
Kr. 100 pr. besvarelse, og du ville snart runde million nummer to  *o)
Avatar billede NielsErikP Mester
11. februar 2013 - 21:28 #21
Hej..

#18: "Damn" det var noget af en beholdning :-)

Så lukker jeg, tak for hjælpen :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester