Avatar billede Calle5463 Forsker
03. oktober 2016 - 16:35 Der er 15 kommentarer og
1 løsning

Virker, virker ikke, virker!

Det lidt længe siden jeg sidst har gjort noget med php, så jeg skal lige hjælpes lidt: Er ved at lave lidt tabelgymnastik i wordpress med et plugin "PHP Code For Posts"

Den her virkede i går, men ikke nu.
Fatal error: Call to a member function query() on null in C:\xampp\htdocs\wordpress\wp-content\plugins\php-code-for-posts\Classes\Shortcode.php(81) : eval()'d code on line 20

Linie 20 er denne: $result = $conn->query($sql);

<?php
Function forbind_til_database() {
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "wordpress";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
    if ($conn->connect_error) {die("Connection failed: " . $conn->connect_error);} else {echo "Forbindelse er ok";}
}
   
function vis_tillidshverv()    {
$sql = "SELECT * FROM wp_cer_tillidshverv ORDER BY wp_cer_tillidshverv.sortering";

$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // Udskriv data
    echo "<table>" .
        "<tr>" .
            "<td>" . ID . "</td>" .
            "<td>" . Sortering . "</td>" .
            "<td>" . Hverv . "</td>" .
            "<td>" . Beskrivelse . "</td>" .
        "</tr>";
   
    while($row = $result->fetch_assoc()) {
    echo "<tr>" .   
            "<td width='10%'>" . $row["ID"] . "</td> " .
            "<td width='10%'>" . $row["sortering"] . "</td>" .
            "<td width='30%'>" . $row["tillidshverv"] . "</td>" .
            "<td width='50%'>" . $row["beskrivelse"] . "</td>" .
        "</tr>";
    }
    echo "</table>";
} else {
echo "0 results";
}

$conn->close();
}

forbind_til_database();
vis_tillidshverv();
?>



Den her virker lige nu:


<?php

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "wordpress";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
    if ($conn->connect_error) {die("Connection failed: " . $conn->connect_error);} else {echo "Forbindelse er ok";}

$sql = "SELECT * FROM wp_cer_tillidshverv ORDER BY wp_cer_tillidshverv.sortering";

$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // Udskriv data
    echo "<table>" .
        "<tr>" .
            "<td>" . ID . "</td>" .
            "<td>" . Sortering . "</td>" .
            "<td>" . Hverv . "</td>" .
            "<td>" . Beskrivelse . "</td>" .
        "</tr>";
   
    while($row = $result->fetch_assoc()) {
    echo "<tr>" .   
            "<td width='10%'>" . $row["ID"] . "</td> " .
            "<td width='10%'>" . $row["sortering"] . "</td>" .
            "<td width='30%'>" . $row["tillidshverv"] . "</td>" .
            "<td width='50%'>" . $row["beskrivelse"] . "</td>" .
        "</tr>";
    }
    echo "</table>";
} else {
echo "0 results";
}

$conn->close();

?>
Avatar billede olsensweb.dk Ekspert
03. oktober 2016 - 16:45 #1
ref
function vis_tillidshverv()    {
$sql = "SELECT * FROM wp_cer_tillidshverv ORDER BY wp_cer_tillidshverv.sortering";

$result = $conn->query($sql);
.....


jeg syntes ikke jeg kan se du tager din connection med over !!


prøv at rette til
function vis_tillidshverv($conn)    {
$sql = "SELECT * FROM wp_cer_tillidshverv ORDER BY wp_cer_tillidshverv.sortering";

$result = $conn->query($sql);
.....


og der hvor du kalder functionen
fra
vis_tillidshverv()
til
vis_tillidshverv($conn)
Avatar billede Calle5463 Forsker
03. oktober 2016 - 17:04 #2
Tak Olsen

Jeg har haft en til at prøve at sætte op, så jeg kan arbejde på samme projekt fra både min desktop og laptop (xampp, dropbox). Det virkede ikke særlig godt. Begge pc skulle køre, og måske det også har ødelagt ting og sager. Så lige nu afinstallere jeg skidtet og laver en ny install.  Så må jeg undvære den mulighed.
Når jeg er klar igen prøver jeg lige dit forslag.
Avatar billede olsensweb.dk Ekspert
03. oktober 2016 - 17:05 #3
et alternativ til at overfører en værdi som parameter er at anvende global
http://php.net/manual/en/language.variables.scope.php
men jeg vil ikke anbefale det, da du så ikke har styr på hvor din variable bliver påvirket, og det anses som dårlig stil at anvende global, så gør som jeg viste i #1, overfør din connection som parameter
Avatar billede Calle5463 Forsker
03. oktober 2016 - 17:21 #4
#Olsen, jeg prøver #1, den med globale variabler kan jeg heller ikke lide af præcist samme grunde.
Skal lige helt op at rulle med den nye inst.
Avatar billede Calle5463 Forsker
03. oktober 2016 - 22:36 #5
#Olsen

Jeg bruger nu min database og site på one.com i stedet for den på min pc - l..... laver en masse knuder, så jeg afinstaller de og glemmer pt alt om at gøre det på min pc.

Jeg får stadig denne: Fatal error: Call to a member function query() on null in /customers/7/0/2/21131197.dk/httpd.www/fvf2/wp-content/plugins/php-code-for-posts/Classes/Shortcode.php(81) : eval()'d code on line 22
(Koden er skrevet i et plugin, som giver mig en shortcode)

Jeg får "ok" til at den finder min database, og der er to registreringer i tabellen, som udskrives med koden hvor jeg ikke bruger functioner

Måske jeg lige skulle prøve med en global variable (hvordan?), bare for om der kommer hul igennem på den måde?


function vis_tillidshverv($conn) {
    $sql = "SELECT * FROM fvf2_cer_tillidshverv ORDER BY fvf2_cer_tillidshverv.sortering";

[linie 22]    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        // Udskriv overskrifter
Avatar billede Calle5463 Forsker
03. oktober 2016 - 22:43 #6
- det virker med $GLOBALS['conn']

Men skal jeg ikke sørge for at blanke den når jeg er færdig med den?

$GLOBALS['conn'] = ""; efter jeg har lavet close
Avatar billede olsensweb.dk Ekspert
03. oktober 2016 - 23:15 #7
havde ikke set din forbind_til_database() ikke retunerede en connection :(
dette bør virke (utested)

<?php
function forbind_til_database() {
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "wordpress";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } else {
        echo "Forbindelse er ok";
    }
    return $conn;
}

function vis_tillidshverv($conn) {
    $sql = "SELECT * FROM wp_cer_tillidshverv ORDER BY wp_cer_tillidshverv.sortering";

    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        // Udskriv data
        echo "<table>" .
        "<tr>" .
        "<td>" . ID . "</td>" .
        "<td>" . Sortering . "</td>" .
        "<td>" . Hverv . "</td>" .
        "<td>" . Beskrivelse . "</td>" .
        "</tr>";

        while ($row = $result->fetch_assoc()) {
            echo "<tr>" .
            "<td width='10%'>" . $row["ID"] . "</td> " .
            "<td width='10%'>" . $row["sortering"] . "</td>" .
            "<td width='30%'>" . $row["tillidshverv"] . "</td>" .
            "<td width='50%'>" . $row["beskrivelse"] . "</td>" .
            "</tr>";
        }
        echo "</table>";
    } else {
        echo "0 results";
    }
}

// jeg har lyst til at kalde min mysqli connection for mysqli uden for functionerne,
// men der er intet i vejen for du kalder den conn her også
$mysqli = forbind_til_database();
vis_tillidshverv($mysqli);
$mysqli->close();

?>



>det virker med $GLOBALS['conn']
ville jeg aldrig bruge

>$GLOBALS['conn'] = ""; efter jeg har lavet close
du sletter variablen med unset
http://php.net/manual/en/function.unset.php


$GLOBALS['conn'] = ""; // nulstiller variablen
unset($GLOBALS['conn']); // sletter variablen

det var heller ikke den global der blev anvendt i eks jeg linkede til i #3
Avatar billede Calle5463 Forsker
04. oktober 2016 - 00:34 #8
- men globalen virkede :-)

Har nu rettet til dit forslag - det må være den manglende returnering af $conn der var problemet - det virker ihvertfald

Tak for hjælpen

(stadig lidt underligt det virkede med min kode forleden! - wordpress-plugins er vist ikke helt til at stole på)
Avatar billede olsensweb.dk Ekspert
04. oktober 2016 - 09:26 #9
det jeg mente med global var at du erklærer variablen som global inde i functionen.
ved global skal variablen vare erklæret uden for functionen, og den skal hedde det sammen som inde i functionen.

eks (utested) vil ikke selv bruge global

<?php
function forbind_til_database() {
    global $conn;
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "wordpress";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } else {
        echo "Forbindelse er ok";
    }   
}

function vis_tillidshverv() {
    global $conn;
    $sql = "SELECT * FROM wp_cer_tillidshverv ORDER BY wp_cer_tillidshverv.sortering";

    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        // Udskriv data
        echo "<table>" .
        "<tr>" .
        "<td>" . ID . "</td>" .
        "<td>" . Sortering . "</td>" .
        "<td>" . Hverv . "</td>" .
        "<td>" . Beskrivelse . "</td>" .
        "</tr>";

        while ($row = $result->fetch_assoc()) {
            echo "<tr>" .
            "<td width='10%'>" . $row["ID"] . "</td> " .
            "<td width='10%'>" . $row["sortering"] . "</td>" .
            "<td width='30%'>" . $row["tillidshverv"] . "</td>" .
            "<td width='50%'>" . $row["beskrivelse"] . "</td>" .
            "</tr>";
        }
        echo "</table>";
    } else {
        echo "0 results";
    }
}

$conn = "";
forbind_til_database();
vis_tillidshverv();
$conn->close();
?>


den global du anvendte er en super global som er et system array
af andre kendte super globale er feks. $_SESSION, $_POST, $_GET.
http://php.net/manual/en/language.variables.superglobals.php
http://www.w3schools.com/php/php_superglobals.asp

...............


forbedrings forslag:
lad vis_tillidshverv() retunerer dit dataset, og lav HTML formateringen (din tabel) uden for functionen, så kan du anvende functionen mere generalt.

anvend Prepare Statement i vis_tillidshverv(), for størrer sikkerhed, mod feks sql injection, pt. er du ikke sårbar, men kommer der senere data ude fra, så bliver du.
Avatar billede Calle5463 Forsker
04. oktober 2016 - 12:49 #10
Et af mine næste træk ville faktisk være, at få programmet til at være mere sikkert (preparet)

Når jeg anvender det i pluginnet er det begrænset hvor komplicerede ting jeg kan lave (såvidt jeg kan greje), jeg kan fx ikke kalde et andet snip og dermed en anden php-fil. Alt skal være i samme snip, og jeg kan heller ikke bruge andet end php - såvidt jeg kan finde ud af.
Avatar billede olsensweb.dk Ekspert
04. oktober 2016 - 13:30 #11
Når jeg anvender det i pluginnet er det begrænset hvor komplicerede ting jeg kan lave (såvidt jeg kan greje), jeg kan fx ikke kalde et andet snip og dermed en anden php-fil.
ville du ikke i en snippet kunne bruge include / include_once / require / require_once ??

functionen forbind_til_database() som vist i #7 ville være oplagt at ligge i en extern central placeret fil (mysqli_toolbox.php)
og functionen vis_tillidshverv($conn) også som vist i #7 ville være oplagt at ligge i en extern fil i projectet. jeg ville ligge alle mine sql kaldt ud i functioner, og samle dem i en extern fil (model.php)


prøv at lave disse 2 externe filer (), og denne snippet, det kan være du skal angive parth til hvor filerne ligge i din require_once


ud fra coden i #7 er det kun det fremhævet der er tilføjet, og så brudt op i externe filer

mysqli_toolbox.php (ville jeg ligge centralt)
<?php
function forbind_til_database() {
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "wordpress";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } else {
        echo "Forbindelse er ok";
    }
    return $conn;
}
?>


model.php (ville jeg ligge i projected)
<?php
require_once("mysqli_toolbox.php");
function vis_tillidshverv($conn) {
    $sql = "SELECT * FROM wp_cer_tillidshverv ORDER BY wp_cer_tillidshverv.sortering";

    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        // Udskriv data
        echo "<table>" .
        "<tr>" .
        "<td>" . ID . "</td>" .
        "<td>" . Sortering . "</td>" .
        "<td>" . Hverv . "</td>" .
        "<td>" . Beskrivelse . "</td>" .
        "</tr>";

        while ($row = $result->fetch_assoc()) {
            echo "<tr>" .
            "<td width='10%'>" . $row["ID"] . "</td> " .
            "<td width='10%'>" . $row["sortering"] . "</td>" .
            "<td width='30%'>" . $row["tillidshverv"] . "</td>" .
            "<td width='50%'>" . $row["beskrivelse"] . "</td>" .
            "</tr>";
        }
        echo "</table>";
    } else {
        echo "0 results";
    }
}
?>


snippet
<?php
require_once("model.php");
// jeg har lyst til at kalde min mysqli connection for mysqli uden for functionerne,
// men der er intet i vejen for du kalder den conn her også
$mysqli = forbind_til_database();
vis_tillidshverv($mysqli);
$mysqli->close();
?>
Avatar billede Calle5463 Forsker
04. oktober 2016 - 16:57 #12
#11, Olsen

ville du ikke i en snippet kunne bruge include / include_once / require / require_once ??

Det ved jeg faktisk ikke, men en snippet "lægger" vel egentligt bare koden ind i en php-fil som udgør det der laver siden, og så burde det jo kunne lade sig gøre som i alle andre php-filer.

Den lille programstump vi strikker på her, var fra start tænkt som en øvelse for mig, så jeg kunne "få hul igennem", og bagefter bruge den samme struktur til at lave udskrift og vedligehold af andre tabeller. Derfor har jeg pt ikke overvejet så meget at kunne udnytte funktioner i andre snippets, men hvis det nu er ligetil, så er det da en god ide.

Grundlæggende var min ide til at lave noget selv i php, at jeg ville udnytte WP's login sammen med et plugin "Ultiativ Member", som kan styre adgang til menupkt'er og sider pga tildelte roller til medlemmer. Men jeg har ikke lyst til at udvide "UM" med en masse felter udover de der er standard, så derfor vil jeg lave min egen tabel med medlemsdata.

Desuden vil jeg lave det sådan, at nye der ønsker medlemsskab skal anmode om det, så kassereren kan tjekke og godkende ansøgninger (fx.: Passer ansøgning om bådplads med den båd vedkommende kommer med?). Hvis ok, godkender kassereren og sender betalingsoplysninger m.m.

Hvis der er en plads ledig, skal det håndteres at vedkommende får tilbudt en anpart, som ved betaling medføre pladsen registreres på medlemmet. Er der ikke plads ledig, kommer vedkommende på venteliste (først til mølle). Bliver en plads ledig, vises venteliste for kasseren, som kan kontakte/sende tilbud til første på venteliste, osv, osv.

Så fra at have været en lille projekt med medlemsliste, så er det nu blevet et lidt større men ikke uoverskueligt hyggeprojekt.

Jeg må indrømme, at jeg overvejer at lave det som et plugin, og der passer dit seneste forslag vist som fod i hose. Men nu skal jeg først lige hygge mig med at få det strikket sammen og til at virke. Og derfor ville det være fantastisk med lidt input og kritik her og hen ad vejen.

Jeg prøver lige dit seneste forslag når jeg får lidt "plads" for de ni hundehvalpe der drøner rundt bagom ryggen på mig :-)
Avatar billede Calle5463 Forsker
04. oktober 2016 - 18:51 #13
Yejks!
Warning: require_once(): http:// wrapper is disabled in the server configuration by allow_url_include=0 in /customers/7/0/2/xxxxxxxx.dk/httpd.www/fvf2/wp-content/plugins/php-code-for-posts/Classes/Shortcode.php(81) : eval()'d code on line 3 Warning: require_once(http://xxxxxxxx.dk/fvf2/CER_project/model.php): failed to open stream: no suitable wrapper could be found in /customers/7/0/2/xxxxxxxx.dk/httpd.www/fvf2/wp-content/plugins/php-code-for-posts/Classes/Shortcode.php(81) : eval()'d code on line 3 Fatal error: require_once(): Failed opening required 'http://xxxxxxxx.dk/fvf2/CER_project/model.php' (include_path='.:/usr/share/php') in /customers/7/0/2/xxxxxxxx.dk/httpd.www/fvf2/wp-content/plugins/php-code-for-posts/Classes/Shortcode.php(81) : eval()'d code on line 3
Avatar billede Calle5463 Forsker
04. oktober 2016 - 19:20 #14
Plugin Options (+ = valgt)

(-) Remove all options and tables on uninstall
(+) Parse inline plugin shortcode tags inside post content (HTML Editor Only)
(+) Parse inline plugin shortcode tags inside sidebar text widgets
(+) Enable Codemirror's rich editor for code snippets
(-) Extract shortcode params to their own variables *
(+) Use Ajax to save snippets
Change the shortcode for the plugin (not recommended if you already have snippets!): php

Dette er hvad dr står i php-code-for-posts.php:
<?php
/**
* Plugin Name: PHP Code For Posts
* Description: Insert and Execute PHP Code in WordPress Content.  This plugin also enables shortcodes for the text widget.
* Version: 2.1.3.1
* Author: Jamie Fraser
* Author uri: http://www.jamiefraser.co.uk/?utm-campaign=PHPCodeForPosts
* Donate: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=SFQZ3KDJ4LQBA
* Text Domain: phpcodeforposts
**/

if (function_exists('session_status')) {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if(session_id() == '') {
        session_start();
    }
}
global $PHPPC;
include('Classes/PhpCodeForPosts.php');

$plugin_directory = trailingslashit( dirname( __FILE__ ) );
$plugin_web_path = trailingslashit( plugins_url( '', __FILE__ ) );

$PHPPC = new PhpCodeForPosts( $plugin_directory, $plugin_web_path );
register_activation_hook( __FILE__ , array( "PhpCodeForPosts_Install" , "activation_hook" ) );
register_uninstall_hook( __FILE__, array( "PhpCodeForPosts_Install", "uninstall_hook" ) );
add_action( 'plugins_loaded', 'PHPPC_text_domain' );

function PHPPC_text_domain()
{
    load_plugin_textdomain("phpcodeforposts", false, basename( dirname( __FILE__ ) ) );
}


- og dette står der (bla.) i readme:
The plugin also contains a variable array which you can add variables to for use between snippets called $_var and is available though the global variable $PHPPC which is an object, so its $PHPPC::$_vars[]

The plugin's shortcode can also accept parameters using the param attribute, the value should be a string of name=value pairs, separated by &s, for example [php snippet=2 param="var1=val1&var2=val2"]. Within your snippet, the parameters are assigned a $_parameters array, for example echo $_parameters["var1"]; //outputs "val1"
Avatar billede olsensweb.dk Ekspert
04. oktober 2016 - 19:24 #15
#13
du burde kunne anvende include og require
https://code.tutsplus.com/articles/how-to-include-and-require-files-and-templates-in-wordpress--wp-26419

lidt om den plugin
https://srd.wordpress.org/plugins/php-code-for-posts/


google php-code-for-posts Classes Shortcode wrapper is disabled in the server configuration by allow_url_include=0
http://stackoverflow.com/questions/23285503/warning-require-once-http-wrapper-is-disabled-in-the-server-configuration

så prøv at erstatte
require_once(http://xxxxxxxx.dk/fvf2/CER_project/model.php):

med
require_once("/CER_project/model.php"):
dvs uden http://xxxxxxxx.dk/

eller
require_once($_SERVER['DOCUMENT_ROOT'].'/CER_project/model.php');
Avatar billede Calle5463 Forsker
04. oktober 2016 - 20:00 #16
måske filerne skal ligge et bestemt sted?

linie 7: require_once($_SERVER['DOCUMENT_ROOT'].'/CER_project/model.php');

Warning: require_once(/customers/7/0/2/xxxxxxxx.dk/httpd.www/CER_project/model.php): failed to open stream: No such file or directory in /customers/7/0/2/xxxxxxxx.dk/httpd.www/fvf2/wp-content/plugins/php-code-for-posts/Classes/Shortcode.php(81) : eval()'d code on line 7 Fatal error: require_once(): Failed opening required '/customers/7/0/2/xxxxxxxx.dk/httpd.www/CER_project/model.php' (include_path='.:/usr/share/php') in /customers/7/0/2/xxxxxxxx.dk/httpd.www/fvf2/wp-content/plugins/php-code-for-posts/Classes/Shortcode.php(81) : eval()'d code on line 7

- eller -

linie 5: require_once("/CER_project/model.php");

Warning: require_once(/CER_project/model.php): failed to open stream: No such file or directory in /customers/7/0/2/xxxxxxx.dk/httpd.www/fvf2/wp-content/plugins/php-code-for-posts/Classes/Shortcode.php(81) : eval()'d code on line 5 Fatal error: require_once(): Failed opening required '/CER_project/model.php' (include_path='.:/usr/share/php') in /customers/7/0/2/xxxxxxxx.dk/httpd.www/fvf2/wp-content/plugins/php-code-for-posts/Classes/Shortcode.php(81) : eval()'d code on line 5
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

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