| 
<?php
 /**
 * This file is an example of an application with Snippet class.
 * Distribution is intended for education / studying purposes only.
 *
 * Copyright [2020] [Wim Niemans <[email protected]>]
 */
 
 include_once '../Snippet.class.php';
 
 /**
 * @author  wim niemans, Rotterdam, Bonn
 * @license EUPL
 */
 
 class sqlSnippet {
 
 public    $name       = '';                            // name, will be used for tVar's
 
 private const SNIPPETS =
 [
 'UPDATE'  => 'UPDATE {which} SET {what} {where} {orderBy} {limit}', // general UPDATE
 'DELETE'  => 'DELETE FROM {which} {where} {orderBy} {limit}',       // general DELETE
 'INSERT'  => 'INSERT INTO {which} SET {what}',                      // general INSERT
 'CREATE'  => 'INSERT INTO {which} ({cols}) VALUES ({values})',      // alternative INSERT syntax
 'MODIFY'  => 'REPLACE INTO {which} SET {what}',                     // alternative UPDATE syntax, general REPLACE
 'REPLACE' => 'REPLACE INTO {which} ({cols}) VALUES ({values})',     // alternative UPDATE syntax, alternative REPLACE syntax
 'LOOKUP'  => 'SELECT {what} FROM {which} {where}',                  // general LOOKUP: getOne item
 'SUMMARY' => 'SELECT DISTINCT {what} FROM {which} {where}',         // get DISTINCT items
 'COUNT'   => 'SELECT COUNT(*) AS rowCount FROM {which} {where}',    // get COUNT rows
 ];
 
 protected $sql      = '';  // complete sql statement
 
 private   $snippet  = '';
 
 /**
 * syntax elements : where, orderBy, Limit
 */
 public    $orderBy   = '';                            // optional orderBy colNames
 public    $limit     = '';                            // optional Limit clause
 public    $where     = '';                            // where conditions, condensed from $this->when, optional extended by addPredicate()
 
 public function __construct($command)
 {
 $name             = strtoupper($command);
 $this->name       = 'command::' . $name;
 $this->snippet    = self::SNIPPETS[$command];
 }
 
 public function getSQL()
 {
 return $this->sql;
 }
 
 /**
 * creates a sql statement
 *
 * @param   array  $what   column names
 * @param   array  $values column values :note: string values should contain proper quoteing
 * @returns string sql statement
 */
 public function createSql($what = array(), $values = array())
 {
 $templet = new Snippet('remove');
 $templet->setVar('snippet', $this->snippet);
 $templet->setVar('which',   $this->which);
 
 if (!empty($what)) {
 if (!is_array($what)) {
 $templet->setVar('what', $what);
 } elseif (array_diff_key($what, array_keys(array_keys($what)))) {      // is assoc ?
 $templet->setVar('cols',   implode(', ', array_keys($what)));
 $templet->setVar('values', implode(', ', array_values($what)));
 } elseif (!empty($values)) {
 $templet->setVar('cols',   implode(', ', $what));
 $templet->setVar('values', implode(', ', $values));
 } else {
 $templet->setVar('what',   implode(', ', $what));
 }
 }
 
 if (!empty($this->where))   { $where   = ' WHERE '    .$this->where;   }
 if (!empty($this->orderBy)) { $orderBy = ' ORDER BY ' .$this->orderBy; }     //  $this->guessOrderBy();
 if (!empty($this->limit))   { $limit   = ' LIMIT '    .$this->limit;   }     //  $this->guessLimit();
 
 $templet->setVar('where',   $where);
 $templet->setVar('orderBy', $orderBy);      //  $this->guessOrderBy();
 $templet->setVar('limit',   $limit);        //  $this->guessLimit();
 
 $this->sql = $templet->parse('output', 'snippet');
 $this->sql = $templet->tidy('output');
 
 return $this->getSQL();
 }
 
 /**
 * sets which: sqlTable name
 */
 public function setWhich($which)
 {
 $this->which = $which;
 }
 
 public function addWhere($_string, $how = 'AND')
 {
 if (!empty($_string)) {
 $string = $this->makeNative($_string);
 if (empty($this->where)) { $this->where  = $string; }
 else                     { $this->where .= ' ' .$how. ' (' .$string. ')'; }
 }
 }
 
 public function setLimit($limit)
 {
 $this->limit = $limit;
 }
 
 public function setOrderBy($orderBy)
 {
 if (!empty($this->orderBy)) { $this->orderBy .= ', '; }
 $this->orderBy .= $orderBy;
 }
 
 }  // end of sqlSnippet class
 ?>
 |