Gå til innhold

Lageret - Tråden hvor forslag til gjenbrukbar PHP-kode legges


Anbefalte innlegg

Forumet hadde lenge tråden PHP kode som andre kanskje kan bruke, men et stadig problem var at det ble postet kode ikke av alle vurdert som (gjen-/)brukbar og tråden ble derfor ganske utvannet. Tråden Diskusjon : Skal det lages et bedre system for deling av god PHP-kode? ble laget hvor jeg fikk lurt min mening inn som noe flertallet ønsket, og dette er resultatet.

 

Dette nye systemet består av Tråden hvor forslag til gjenbrukbar PHP-kode legges og Kvalitetssikret og gjenbrukbar PHP-kode til fri bruk. Kodeforslag legges i den første tråden hvor en diskusjon om kvalitet og forbedringer kan holdes. Dersom koden blir vurdert til å være av god nok kvalitet og foreslåtte forbedringer blir gjort vil en moderator flytte den aktuelle posten inn i den siste tråden som er låst. På den måten holdes S/N høy og kvaliteten blir av god nok kvalitet til at den kan anbefales og gjenbrukes.

 

--

 

I denne forslagstråden bør målet være å felles samle opp og sammarbeide om et fundament av god kode. Jeg håper derfor på saklig og konstruktiv diskusjon og kritikk med forumets to første regler sterkt i minnet.

 

Dersom eventuelle regler for denne tråden er ønsket er det bare å rope det ut til diskusjon.

 

Til slutt vil jeg bare skyte inn en kommentar om bruk av andres kode og lisenser. Dersom koden her skal med god samvittighet kunne brukes i kommersiell sammenheng, i fri programvare, eller i prosjekter med potensiale til å bli en av de to er det viktig at det blir oppgitt hvilken bruk som er tillatt når koden er av en viss kompleksitet. Her i tråden kan det enkelt oppgis ved å enten skrive noe så enkelt som "Fri bruk gis til hvem som helst til å gjøre hva som helst med koden" eller å oppgi navnet til én eller flere av de vanlige lisenene som BSD, MIT, GPL, LGPL, CC Attribution eller lignende.

Endret av JohndoeMAKT
Lenke til kommentar
Videoannonse
Annonse

Okei, da er vell jeg første mann ut :) - egentlig så blir denne posten en slags test post for min del, siden jeg vil finne ut hvor komplekse koder man skal legge ut.

 

Om det er hele CMS'er eller koder som er mer enn små snutter...

 

db_connect.class.php

Klikk for å se/fjerne innholdet nedenfor
<?php
/*
Connect and select database using classes
Copyright (C) 2008  Fredrik Moe

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
/*------------------------------------------------------------------------*/


class conn {
function connect_mysql($host, $user, $pass)
{
	$link = mysql_connect($host, $user, $pass);
	if (!$link) {
		die('MySQL error: Could not connect: ' . mysql_error()) . "<br>";
	}
}
function select_db($db_name)
{
	$db_select = mysql_select_db($db_name);
	if (!$db_select) {
		die ("MySQL error: Can't use $db_name database : " . mysql_error()) . "<br>";
	}
}
}

/*Example for connection and selecting database*/
//Create an connection
$conn = new conn();

//Call the conn class and the db class
//$conn->mysql('localhost', '****', '******');
//$conn->select_db('****');
?>

 

Også vil jeg vite hvordan man får opp php tagger, fordi dem funker ikke her




			
				


	Endret  av Famen
	
	

			
		
Lenke til kommentar

Jepp, det er egentlig ikke slike kommentarer jeg er ute etter... - Nå fikk jeg egentlig litt ut av den kommentaren, at du ikke ville ha flere klasser og koder som det allerede florerer av på nettet. Supert!

 

Men hva om kompleksitet av kode? - er det noen som har en kommentar om dette, i forhold til hva som burde og ikke burde bli lagt ut her...

Lenke til kommentar

Her er mine kommentarer til koden:

 

Metoder som dette setter jeg pris på:

$numUpdatedRows = $conn->update( $sql );
$newAutoIncrementId = $conn->insert( $sql );

$sql er fullverdige SQL-settninger, men alt etter hvilken "utføringsmetode" den kjøres med returneres mysql_num_rows_something osv.

 

Det bør også være mulig å kjøre de to metodene i konstruktøren.

 

Litt mer kritisk:

- die() er en uting som ikke bør brukes

- metodene bør kaste exceptions i stedet

- variabler bør testes før potensielt kritiske feil kan oppstå

- navnet er ikke mye forklarende

- metodene bør returnere boolianske verdier dersom exceptionkasting ikke blir lagt til

- $link bør være en klassevariabel som kan hentes ut slik at flere databaser kan tilkobles samtidig

 

Og til slutt hadde jeg selv defaulted til 'localhost', 'root' og '' i connect-metoden, men ikke alle er så dumdristige/late som meg.

 

--

 

Når det gjelder kodekompleksitet skal det nok ikke mye til ( i antall linjer ) før det er verd å ta vare på, så lenge det er bra og anvendelig. Jeg har f.eks funksjonene setCookie, getCookie og deleteCookie i javascript jeg alltid drar med meg, ikke fordi de er så fantastisk bra skrevet at jeg ikke kan gjøre det på nytt, men fordi de gjør jobben bra og å reimplementere de er kjedelig.

Lenke til kommentar
Jeg har f.eks funksjonene setCookie, getCookie og deleteCookie i javascript jeg alltid drar med meg, ikke fordi de er så fantastisk bra skrevet at jeg ikke kan gjøre det på nytt, men fordi de gjør jobben bra og å reimplementere de er kjedelig.

Så enig, så enig. Jeg har selv en DB-klasse, og jeg ser nå at den inneholder kode som ikke er blitt endret på på over flere år. Et godt og funksjonelt rammeverk er et must for min del.

 

 

<?php

class MySQL {

	// Store general connection-information

	private $mysqlAddress;
	private $mysqlUsername;
	private $mysqlPassword;

	private $mysqlConnection;
	private $mysqlErrors = array();
	private $mysqlQueries = array();
	private $mysqlNumQueries = 0;
	private $mysqlNumRows = 0;
	private $mysqlAffectedRows = 0;

	private $mysqlTimer;
	private $mysqlTotalTime = 0;

	public function __construct ( $address, $username, $password, $db = NULL ) {

		parent :: __construct ();

		$this -> mysqlTimer = new FR_Object_Timer ();

		$this -> mysqlAddress = $address;
		$this -> mysqlUsername = $username;
		$this -> mysqlPassword = $password;

		if ( $db ) $this -> selectDB ( $db );

	}

	public function connect () {

		if ( is_resource ( $this -> mysqlConnection ) )
			return true;

		if ( $this -> mysqlConnection = mysql_connect ( $this -> mysqlAddress,
														$this -> mysqlUsername,
														$this -> mysqlPassword, true ) )
			return true;
		else
			return false;

	}

	public function selectDB ( $database ) {

		$this -> connect ();

		mysql_select_db ( $database, $this -> mysqlConnection );

	}

	public function getNext ( $query, $type = MYSQL_BOTH ) {

		if ( array_key_exists ( $query, $this -> mysqlQueries ) )
			return mysql_fetch_array ( $this -> mysqlQueries[$query], $type );

		$this -> mysqlQueries[$query] = $this -> run ( $query );
		return $this -> getNext ( $query, $type );

	}

	public function run ( $query ) {

		if ( is_array ( $query ) )
			return array_map ( array(&$this, 'run'), $query );

		$this -> connect ();
		$this -> mysqlTimer -> resetTime ();

		$resource = mysql_query ( $query, $this -> mysqlConnection );

		if ( !$resource ) {

			$this -> mysqlErrors[] = array (
				'error' => mysql_error ( $this -> mysqlConnection ),
				'query' => $query
			);

		} else {

			$this -> mysqlNumQueries++;
			$this -> mysqlTotalTime += $this -> mysqlTimer -> getTime ();

			if ( stristr ( $query, 'select' ) )
				$this -> mysqlNumRows = mysql_num_rows ( $resource );

			if ( stristr ( $query, 'insert' ) ||
				 stristr ( $query, 'update' ) ||
				 stristr ( $query, 'delete' ) ||
				 stristr ( $query, 'replace' ) )
				$this -> mysqlAffectedRows = mysql_affected_rows ( $this -> mysqlConnection );

		}

		return $resource;

	}

	public function getRow ( $query, $type = MYSQL_ASSOC ) {

		if ( $type == MYSQL_ASSOC )
			return mysql_fetch_assoc ( $this -> run ( $query ) );
		elseif ( $type == MYSQL_NUM )
			return mysql_fetch_row ( $this -> run ( $query ) );

	}

	public function getNumRows () {

		return $this -> mysqlNumRows;

	}

	public function getAffectedRows () {

		return $this -> mysqlAffectedRows;

	}

	public function getMysqlConnection () {

		return $this -> mysqlConnection;

	}

	public function getNumQueries () {

		return $this -> mysqlNumQueries;

	}

	public function getQueryTime () {

		return $this -> mysqlTotalTime;

	}

	public function getLastId () {

		return mysql_insert_id ( $this -> mysqlConnection );

	}

	public function escape ( $string ) {

		return mysql_real_escape_string ( $string, $this -> mysqlConnection );

	}

	public function getErrors () {

		return $this -> mysqlErrors;

	}

	public function __destruct () {

		if ( is_resource ( $this -> mysqlConnection ) )
			mysql_close ( $this -> mysqlConnection );

	}

}

?>

 

 

<?php

$query = 'SELECT users.* '
	   . 'FROM users';

while ( $user = $db -> getNext ( $query ) )
	print_r ( $user );

echo 'Number of users: ' . $db -> getNumRows ();

?>

 

<?php

$query = 'SELECT user.* '
	   . 'FROM users user '
	   . 'WHERE user.id = \'' . $db -> escape ( $_GET['id'] ) . '\'';

print_r ( $db -> getRow ( $query ) );

?>

Endret av Jonas
Lenke til kommentar

Da kan jeg jo slenge med en bit kode som konverterer en PHP-array til en JS-array:

function php_to_js_array($in, $variable, $first = true)
{
	$o = ($first?'var ':'').$variable.' = new Array();';
	if ( is_array ( $in ) && count ( $in ) )
	{
		foreach ($in as $key => $value)
		{
			if (is_array($value))
			{
				$o .= php_to_js_array($value, $variable.'['.(is_numeric($key)?$key:'"'.str_replace('"', '\"', $key).'"').']', false);
			}
			else
			{
				$value = str_replace ( "\r", '', $value );
				$value = str_replace ( "\n", '', $value );
				$o .= $variable.'['.(is_numeric($key)?$key:'"'.str_replace('"', '\"', $key).'"').'] = '.(is_numeric($value)?$value:'"'.str_replace('"', '\"', $value).'"').";";
			}
		}
	}
	return $o;
}

Lenke til kommentar

Enkel template-"motor":

<?php
class Template{
private $template_data; 				# Holds all the template variables

# Contructor, define the template and template file
public function __construct($template_file) {
	$this->file = $template_file;
}
# Set a template variable
public function set($name, $value) {
	$this->template_data[$name] = $value;		# Add the string to the variables array.
}
# template is run and returned when string data is requested by other functions.
public function __toString(){
	if(count($this->template_data)){		# Check if template actually has variables (to avoid errors).
		extract($this->template_data);		# Extract the template variables to local namespace
	}

	ob_start();					# Start output buffering
	include($this->file);				# Include the file
	$template_contents = ob_get_contents();		# Get the contents of the buffer
	ob_end_clean();					# End buffering and discard
	return $template_contents;				# Return the contents
}
}
?>

 

Ganske gammel, men har brukt den i mange prosjekter.

Endret av Rabbid
Lenke til kommentar
  • 2 uker senere...

En liten vri-om på skriptet til Famen:

 

//========================================
// MySQL Databse Variabler
//========================================

$host = "localhost";
$bruker = "root";
$pass = "";
$db = "mafiaspill";

//========================================
// Koble til, via klasse..
//========================================

class con {

	function hoved_sql($host,$bruker,$pass) {
		mysql_connect($host,$bruker,$pass);
	}
	function select_db($db) {
		mysql_select_db($db);
	}

}

$con = new con();

$con->hoved_sql($host,$bruker,$pass);
$con->select_db($db);

Lenke til kommentar
I denne forslagstråden bør målet være å felles samle opp og sammarbeide om et fundament av god kode. Jeg håper derfor på saklig og konstruktiv diskusjon og kritikk med forumets to første regler sterkt i minnet.

 

Anywho, det er helt sant, jeg bare påpeker at du ikke har gjort noen "Vri-om" på scriptet mitt, du har bare lagt ut samme koden som din egen...

Lenke til kommentar
Ingen av scriptene deres bør legges i noen samling over kvalitetskode uansett, så dere taper begge to.

 

Ja, er fullstendig klar over dette, koden som jeg la ut var for at jeg skulle finne ut hvor komplekst koden/scriptet skulle være - som jeg fikk svar på :)

 

btw Lokaltog: har ikke du en kode som er kvalitetsbevist utført? :D

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...