[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 852
  • Last Modified:

PHP RecordSet and PageSize

I am trying to learn PHP, right now I know ASP but I want to be a more platform independant so I am learning PHP
Here is a snipit of my ASP Code

      Set cnnsearch = server.createobject("ADODB.connection")
      cnnsearch.open "newsindex"  'ODBC connection to an Access DB
      set rstsearch = server.createobject("ADODB.recordset")

        StrSql = "Select * from blah blah blah 'SQL statement which I know works fine.

            rstSearch.PageSize  = 12
            rstSearch.CacheSize = 12
      
      rstsearch.open StrSql, cnnsearch, adOpenStatic, adLockReadOnly, adCmdText
      iRecordCount = rstSearch.RecordCount
      iPageCount   = rstSearch.PageCount

here is my best shot at converting this to PHP, keep in mind I have no real experience with PHP.

                        $cnnsearch = new COM('ADODB.Connection');
                        $cnnsearch->open('Data Source=newsindex');
                             $StrSql = "Select * from blah blah blah";
                                $rstSeach = new COM('ADODB.RecordSet');
                        $rstSearch->PageSize(12);
                        $rstSearch->CacheSize(12);
                        $rstSeach->ActiveConnection = $cnnsearch;
                        $rstSeach->LockType = adLockReadOnly;
                        $rstSeach->CursorLocation = 3;
                        $rstSeach->CursorType = adOpenStatic;
                        $rstSeach->Open($cnnsearch, $StrSql);
                        $iRecordCount = $rstSearch->RecordCount();
                        $iPageCount = $rstSearch->PageCount();
I am getting an error on the $rstSearch->PageSize(12); line that says
Call to a member function PageSize() on a non-object in D:\Intranet\Newspaperindex\PHP\npisearchtesting.php on line 304
any ideas?
0
nplib
Asked:
nplib
  • 14
  • 10
1 Solution
 
Richard QuadlingSenior Software DeverloperCommented:
You would probably be a LOT better off using ODBC to talk to the Access database.

The COM support in PHP is ok, but the main reason so many extensions exist is that the COM layer has to provide the required functionality or it is a no go.

But, try ...

$rstSearch->PageSize = 12;

PageSize is a property not a method/function.

0
 
nplibAuthor Commented:
How would I go about doing that?

That solution got me past the error I was getting, but has you said, now I am getting COM errors.
0
 
nplibAuthor Commented:
How do I do the above using ODBC?
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
Richard QuadlingSenior Software DeverloperCommented:
You will need to create a DSN string. I don't use Access to any great degree. I use MSSQL 2000.

I also use my own DB class to do all the work rather than issue command directly and have to carry around all the checking with every application.

But essentially ...

<?php
// Make a connection to the data source.
$r_conn = odbc_pconnect($s_DSN, $s_username, $s_password);

// Construct the SQL statement
$s_SQL = "SELECT * FROM table ORDER BY column1, column2";

// Execute the statement.
$r_resultset = odbc_exec($r_conn, $s_SQL);

// Loop through the resultset.
while(False !== ($a_row = odbc_fetch_array($r_resultset)))
 {
 // $a_row contains 1 row from the result set.
 }

// Free the resultset.
odbc_free_result($r_resultset);

// Close the connection.
odbc_close($r_conn);
?>

That's basically the process.

You can do a lot more with parameter binding and such.

0
 
Richard QuadlingSenior Software DeverloperCommented:
I found some notes on Access DSN strings ...

http://www.carlprothman.net/Default.aspx?tabid=90




    *  ODBC Driver for Access

For Standard Security:

oConn.Open "Driver={Microsoft Access Driver (*.mdb)};" & _
           "Dbq=c:\somepath\mydb.mdb;"

If you are using a Workgroup (System database):

oConn.Open "Driver={Microsoft Access Driver (*.mdb)};" & _
           "Dbq=c:\somepath\mydb.mdb;" & _
           "SystemDB=c:\somepath\mydb.mdw;", _
           "myUsername", "myPassword"
 

If want to open up the MDB exclusively

oConn.Open "Driver={Microsoft Access Driver (*.mdb)};" & _
           "Dbq=c:\somepath\mydb.mdb;" & _
           "Exclusive=1;"  

If MDB is located on a Network Share

oConn.Open "Driver={Microsoft Access Driver (*.mdb)};" & _
           "Dbq=\\myServer\myShare\myPath\myDb.mdb;"  
0
 
nplibAuthor Commented:
That was extremely helpful, but would you happen to know how or where I would use the rest of my code,
the PageSize, CacheSize, LockType, Cursorlocation, cursortype, recordcount and pagecount?
0
 
Richard QuadlingSenior Software DeverloperCommented:
What are they for? They may not be of any use outside of ADO. The ODBC drivers looks after a LOT of things. All you need to do is deal with talking to the DB using SQL.

0
 
Richard QuadlingSenior Software DeverloperCommented:
But you MAY be able to simply include them in the DSN string!
0
 
nplibAuthor Commented:
I use those commands for paging,
the PageSize determines how many Rows to display per page,
the CacheSize is how many Rows to cache in memory,
RecordCount will give me how many rows in the DB,
Pagecount takes the number of rows and the number of rows per page and figures out how many pages there will be in total,
Since I was using ASP before PHP I did everything with ADO,
so to use the above I needed a locktype, curortype and cursor location.

How would I then, have it limit the rows per page to say 12,
have it tell me the total number of records, and total number of pages?
0
 
Richard QuadlingSenior Software DeverloperCommented:
I see. ADO offers a bit more than ODBC.

The normal paging mechanism is to use your own page sizes via LIMIT (mysql), but this not present in MS SQL, and I doubt it is available for Access either.

If you want to retry the COM mechanism again, I'll see if I can help you.

If you can supply the script and the full error, I'll see what I can do to help.
0
 
nplibAuthor Commented:
No Problem!

Here is my PHP Code.

<HTML>
      <HEAD>
            <TITLE>Search Results by Full Text</TITLE>
      </HEAD>
      <BODY>
            <?php
            define("adOpenStatic",3);
            define("adLockReadOnly",1);
            //define("adCmdText",&H0001);
            $PAGE_SIZE = 12;  //The size of our pages.
            $ADODB_COUNTRECS = true;
            
            $strUrl = $_SERVER['PHP_SELF'];
            $strPhrase = $_GET["SearchDel"];
            $strKey = $_GET["Key"];
            $strSearch = $strKey;
            $strResult = $strKey;
            
            if ($strSearch == "*") {
                  $strSearch = "%";
            } else {
                  if ($strSearch == "") {
                        $strSearch = "%";
                  } else {
                        if ($strPhrase == "") {
                              $strSearch = str_ireplace(" after ", " ", $strSearch);
                              $strSearch = str_ireplace(" also ", " ", $strSearch);
                              $strSearch = str_ireplace(" an ", " ", $strSearch);
                              $strSearch = str_ireplace(" and ", " ", $strSearch);
                              $strSearch = str_ireplace(" as ", " ", $strSearch);
                              $strSearch = str_ireplace(" at ", " ", $strSearch);
                              $strSearch = str_ireplace(" be ", " ", $strSearch);
                              $strSearch = str_ireplace(" because ", " ", $strSearch);
                              $strSearch = str_ireplace(" before ", " ", $strSearch);
                              $strSearch = str_ireplace(" between ", " ", $strSearch);
                              $strSearch = str_ireplace(" but ", " ", $strSearch);
                              $strSearch = str_ireplace(" for ", " ", $strSearch);
                              $strSearch = str_ireplace(" however ", " ", $strSearch);
                              $strSearch = str_ireplace(" from ", " ", $strSearch);
                              $strSearch = str_ireplace(" if ", " ", $strSearch);
                              $strSearch = str_ireplace(" in ", " ", $strSearch);
                              $strSearch = str_ireplace(" into ", " ", $strSearch);
                              $strSearch = str_ireplace(" of ", " ", $strSearch);
                              $strSearch = str_ireplace(" or ", " ", $strSearch);
                              $strSearch = str_ireplace(" other ", " ", $strSearch);
                              $strSearch = str_ireplace(" out ", " ", $strSearch);
                              $strSearch = str_ireplace(" since ", " ", $strSearch);
                              $strSearch = str_ireplace(" such ", " ", $strSearch);
                              $strSearch = str_ireplace(" than ", " ", $strSearch);
                              $strSearch = str_ireplace(" that ", " ", $strSearch);
                              $strSearch = str_ireplace(" the ", " ", $strSearch);
                              $strSearch = str_ireplace(" these ", " ", $strSearch);
                              $strSearch = str_ireplace(" there ", " ", $strSearch);
                              $strSearch = str_ireplace(" this ", " ", $strSearch);
                              $strSearch = str_ireplace(" those ", " ", $strSearch);
                              $strSearch = str_ireplace(" to ", " ", $strSearch);
                              $strSearch = str_ireplace(" under ", " ", $strSearch);
                              $strSearch = str_ireplace(" upon ", " ", $strSearch);
                              $strSearch = str_ireplace(" when ", " ", $strSearch);
                              $strSearch = str_ireplace(" where ", " ", $strSearch);
                              $strSearch = str_ireplace(" whether ", " ", $strSearch);
                              $strSearch = str_ireplace(" which ", " ", $strSearch);
                              $strSearch = str_ireplace(" with ", " ", $strSearch);
                              $strSearch = str_ireplace(" within ", " ", $strSearch);
                              $strSearch = str_ireplace(" without ", " ", $strSearch);
                              $strSearch = str_ireplace(" @ ", " ", $strSearch);
                              $strSearch = str_ireplace(" & ", " ", $strSearch);
                              $strSearch = str_ireplace(" ! ", " ", $strSearch);
                              $strSearch = str_ireplace(" # ", " ", $strSearch);
                              $strSearch = str_ireplace(" $ ", " ", $strSearch);
                              $strSearch = str_ireplace(" ^ ", " ", $strSearch);
                              $strSearch = str_ireplace(" ` ", " ", $strSearch);
                              $strSearch = str_ireplace(" ~ ", " ", $strSearch);
                              $strSearch = str_ireplace(" ( ", " ", $strSearch);
                              $strSearch = str_ireplace(" ) ", " ", $strSearch);
                              $strSearch = str_ireplace(" - ", " ", $strSearch);
                              $strSearch = str_ireplace(" _ ", " ", $strSearch);
                              $strSearch = str_ireplace(" = ", " ", $strSearch);
                              $strSearch = str_ireplace(" + ", " ", $strSearch);
                              $strSearch = str_ireplace(" < ", " ", $strSearch);
                              $strSearch = str_ireplace(" > ", " ", $strSearch);
                              $strSearch = str_ireplace(" , ", " ", $strSearch);
                              $strSearch = str_ireplace(" . ", " ", $strSearch);
                              $strSearch = str_ireplace(" / ", " ", $strSearch);
                              $strSearch = str_ireplace(" ? ", " ", $strSearch);
                              $strSearch = str_ireplace(" : ", " ", $strSearch);
                              $strSearch = str_ireplace(" ; ", " ", $strSearch);
                              $strSearch = str_ireplace(" [ ", " ", $strSearch);
                              $strSearch = str_ireplace(" ] ", " ", $strSearch);
                              $strSearch = str_ireplace(" { ", " ", $strSearch);
                              $strSearch = str_ireplace(" } ", " ", $strSearch);
                              $strSearch = str_ireplace(" | ", " ", $strSearch);
                              $strSearch = str_ireplace(" \ ", " ", $strSearch);
                              $strSearch = str_ireplace(" &#34; ", " ", $strSearch);
                              $strSearch = str_ireplace("@", " ", $strSearch);
                              $strSearch = str_ireplace("&", " ", $strSearch);
                              $strSearch = str_ireplace("!", " ", $strSearch);
                              $strSearch = str_ireplace("#", " ", $strSearch);
                              $strSearch = str_ireplace("$", " ", $strSearch);
                              $strSearch = str_ireplace("^", " ", $strSearch);
                              $strSearch = str_ireplace("`", " ", $strSearch);
                              $strSearch = str_ireplace("~", " ", $strSearch);
                              $strSearch = str_ireplace("(", " ", $strSearch);
                              $strSearch = str_ireplace(")", " ", $strSearch);
                              $strSearch = str_ireplace("-", " ", $strSearch);
                              $strSearch = str_ireplace("_", " ", $strSearch);
                              $strSearch = str_ireplace("=", " ", $strSearch);
                              $strSearch = str_ireplace("+", " ", $strSearch);
                              $strSearch = str_ireplace("<", " ", $strSearch);
                              $strSearch = str_ireplace(">", " ", $strSearch);
                              $strSearch = str_ireplace(",", " ", $strSearch);
                              $strSearch = str_ireplace(".", " ", $strSearch);
                              $strSearch = str_ireplace("/", " ", $strSearch);
                              $strSearch = str_ireplace("?", " ", $strSearch);
                              $strSearch = str_ireplace(":", " ", $strSearch);
                              $strSearch = str_ireplace(";", " ", $strSearch);
                              $strSearch = str_ireplace("[", " ", $strSearch);
                              $strSearch = str_ireplace("]", " ", $strSearch);
                              $strSearch = str_ireplace("{", " ", $strSearch);
                              $strSearch = str_ireplace("}", " ", $strSearch);
                              $strSearch = str_ireplace("|", " ", $strSearch);
                              //$strSearch = str_ireplace("\", " ", $strSearch);
                              $strSearch = str_ireplace("&#34;", " ", $strSearch);
                              $strSearch = str_ireplace("@ ", " ", $strSearch);
                              $strSearch = str_ireplace("& ", " ", $strSearch);
                              $strSearch = str_ireplace("! ", " ", $strSearch);
                              $strSearch = str_ireplace("# ", " ", $strSearch);
                              $strSearch = str_ireplace("$ ", " ", $strSearch);
                              $strSearch = str_ireplace("^ ", " ", $strSearch);
                              $strSearch = str_ireplace("` ", " ", $strSearch);
                              $strSearch = str_ireplace("~ ", " ", $strSearch);
                              $strSearch = str_ireplace("( ", " ", $strSearch);
                              $strSearch = str_ireplace(") ", " ", $strSearch);
                              $strSearch = str_ireplace("- ", " ", $strSearch);
                              $strSearch = str_ireplace("_ ", " ", $strSearch);
                              $strSearch = str_ireplace("= ", " ", $strSearch);
                              $strSearch = str_ireplace("+ ", " ", $strSearch);
                              $strSearch = str_ireplace("< ", " ", $strSearch);
                              $strSearch = str_ireplace("> ", " ", $strSearch);
                              $strSearch = str_ireplace(", ", " ", $strSearch);
                              $strSearch = str_ireplace(". ", " ", $strSearch);
                              $strSearch = str_ireplace("/ ", " ", $strSearch);
                              $strSearch = str_ireplace("? ", " ", $strSearch);
                              $strSearch = str_ireplace(": ", " ", $strSearch);
                              $strSearch = str_ireplace("; ", " ", $strSearch);
                              $strSearch = str_ireplace("[ ", " ", $strSearch);
                              $strSearch = str_ireplace("] ", " ", $strSearch);
                              $strSearch = str_ireplace("{ ", " ", $strSearch);
                              $strSearch = str_ireplace("} ", " ", $strSearch);
                              $strSearch = str_ireplace("| ", " ", $strSearch);
                              $strSearch = str_ireplace("\ ", " ", $strSearch);
                              $strSearch = str_ireplace("&#34; ", " ", $strSearch);
                              $strSearch = str_ireplace(" @", " ", $strSearch);
                              $strSearch = str_ireplace(" &", " ", $strSearch);
                              $strSearch = str_ireplace(" !", " ", $strSearch);
                              $strSearch = str_ireplace(" #", " ", $strSearch);
                              $strSearch = str_ireplace(" $", " ", $strSearch);
                              $strSearch = str_ireplace(" ^", " ", $strSearch);
                              $strSearch = str_ireplace(" `", " ", $strSearch);
                              $strSearch = str_ireplace(" ~", " ", $strSearch);
                              $strSearch = str_ireplace(" (", " ", $strSearch);
                              $strSearch = str_ireplace(" )", " ", $strSearch);
                              $strSearch = str_ireplace(" -", " ", $strSearch);
                              $strSearch = str_ireplace(" _", " ", $strSearch);
                              $strSearch = str_ireplace(" =", " ", $strSearch);
                              $strSearch = str_ireplace(" +", " ", $strSearch);
                              $strSearch = str_ireplace(" <", " ", $strSearch);
                              $strSearch = str_ireplace(" >", " ", $strSearch);
                              $strSearch = str_ireplace(" ,", " ", $strSearch);
                              $strSearch = str_ireplace(" .", " ", $strSearch);
                              $strSearch = str_ireplace(" /", " ", $strSearch);
                              $strSearch = str_ireplace(" ?", " ", $strSearch);
                              $strSearch = str_ireplace(" :", " ", $strSearch);
                              $strSearch = str_ireplace(" ;", " ", $strSearch);
                              $strSearch = str_ireplace(" [", " ", $strSearch);
                              $strSearch = str_ireplace(" ]", " ", $strSearch);
                              $strSearch = str_ireplace(" {", " ", $strSearch);
                              $strSearch = str_ireplace(" }", " ", $strSearch);
                              $strSearch = str_ireplace(" |", " ", $strSearch);
                              //$strSearch = str_ireplace(" \", " ", $strSearch);
                              $strSearch = str_ireplace(" &#34;", " ", $strSearch);
                        }
                        $strSearch = str_ireplace("*", "%", $strSearch);
                        $strSearch = str_ireplace("'", "''", $strSearch);
                  }
            }

            if (strpos($strKey, "%") == 1) {
                  $strResult = $strResult;
            } else {
                  $strResult = str_ireplace("%", "*", $strResult);
            }

            $dateSearch1 = $_GET["txtDate1"];
            $dateSearch2 = $_GET["txtDate2"];
            $strDateSearch = "%/".$dateSearch1."/".$dateSearch2;
            $strDateSearch = str_ireplace("'", "''", $strDateSearch);
            $dateRange1 = $_GET["RangeDate1"];
            $dateRange2 = $_GET["RangeDate2"];
            $strDateRange1 = $dateSearch1."/01/".$dateSearch2;
            $strDateRange1 = str_ireplace("'", "''", $strDateRange1);

            if (($dateRange1 == "01") || ($dateRange1 == "03") || ($dateRange1 == "05") || ($dateRange1 == "07") || ($dateRange1 == "08") || ($dateRange1 == "10") || ($dateRange1 == "12")) {
                  $strDateRange2 = $dateRange1."/31/".$dateRange2;
                  $strDateRange2 = str_ireplace("'", "''", $strDateRange2);
            }
            
            if (($dateRange1 == "04") || ($dateRange1 == "06") || ($dateRange1 == "09") || ($dateRange1 == "11")) {
                  $strDateRange2 = $dateRange1."/30/".$dateRange2;
                  $strDateRange2 = str_ireplace("'", "''", $strDateRange2);
            }
            
            if ($dateRange1 == "02") {
                  $strDateRange2 = $dateRange1."/28/".$dateRange2;
                  $strDateRange2 = str_ireplace("'", "''", $strDateRange2);
            }
            
            if (($strDateRange1 == "%/01/%") || ($strDateRange2 = "%/01/%)" || $strDateRange1 != $strDateRange2)) {
                  $strSortOrder = $_GET["OrderSort"];
                  $strOrderType = $_GET["SortByType"];
                  $strSplit = $strSearch;
                  $strNewSearch = explode(" ",$strSplit);
                  $strCount = count($strNewSearch);
                        if ($strOrderType == "Item_Date") {
                              $strFstOrder = "Item_Date";
                              $strSndOrder = "Context";
                        } else {
                              $strFstOrder = "Context";
                              $strSndOrder = "Item_Date";
                              $strSortOrder = "ASC";
                        }

                        if ($_GET["page"] == "") {
                              $iPageCurrent = 1;
                        } else {
                              $iPageCurrent = number_format($_GET["page"]);
                        }

                        if (($strSearch != "") || ($strDateSearch != "")) {
            
                              //$cnnsearch = odbc_connect("newsindex","","");
                              
                              $cnnsearch = new COM('ADODB.Connection');
                              $cnnsearch->open('Data Source=newsindex');
                              
                              //exact phrase search

                              if ($strPhrase != "") {
                                    $StrSql = $StrSql."Select * ";
                                    $StrSql = $StrSql."From newspaperindex ";
                                    $StrSql = $StrSql."Where (Keywords LIKE '% ".$strSearch." %' OR Keywords LIKE '".$strSearch." %' OR Keywords LIKE '% ".$strSearch."' OR Keywords LIKE '".$strSearch."' OR Context LIKE '% ".$strSearch." %' OR Context LIKE '".$strSearch." %' OR Context LIKE '% ".$strSearch."' OR Context LIKE '".$strSearch."')";
                                          if (($dateRange1 == "%") && ($dateRange2 == "%")) {
                                                $StrSql = $StrSql."AND (Item_Date LIKE '%".str_ireplace(strDateSearch, "'", "''")."%')";
                                          } else {
                                                if ((($dateRange1 == "%") && ($dateRange2 != "%")) || (($dateRange1 != "%") && ($dateRange2 == "%"))) {
                                                      header("location:newspaperindex.php?key=".$strSearch."&SearchDel=".strPhrase."&txtDate1=".dateSearch1."&txtDate2=".dateSearch2."&RangeDate1=".dateRange1."&RangeDate2=".dateRange2."&OrderSort=".strSortOrder."&SortByType=".strOrderType."&errorlevel=1");
                                                } else {
                                                      $StrSql = $StrSql."AND (Item_Date BETWEEN #".str_ireplace("'", "''", $strDateRange1)."# AND #".str_ireplace("'", "''", $strDateRange2)."#)";
                                                }
                                          }
                                    $StrSql = $StrSql."Order BY ".$strFstOrder." ".$strSortOrder.", ".$strSndOrder.";";
                              } else {
                        //phrased search
                                    if ($strCount >= 1) {      
                                          $StrSql = $StrSql."Select * ";
                                          $StrSql = $StrSql."From newspaperindex ";
                                          $StrSql = $StrSql."Where (";
                                                for ($z=0; $z<=count($strCount); $z++) {
                                                      $StrSql = $StrSql."Keywords LIKE '% ".$strNewSearch[$z]." %' OR Keywords LIKE '".$strNewSearch[$z]." %' OR Keywords LIKE '% ".$strNewSearch[$z]."' OR Keywords LIKE '".$strNewSearch[$z]."' OR Context LIKE '% ".$strNewSearch[$z]." %' OR Context LIKE '".$strNewSearch[$z]." %' OR Context LIKE '% ".$strNewSearch[$z]."' OR Context LIKE '".$strNewSearch[$z]."'";
                                                      if ($z != $strCount) {
                                                            $StrSql = $StrSql."OR ";
                                                      }
                                                }
                                          $StrSql = $StrSql.")";
                                                if (($dateRange1 == "%") && ($dateRange2 == "%")) {
                                                      $StrSql = $StrSql."AND (Item_Date LIKE '%".str_ireplace("'", "''", $strDateSearch)."%')";
                                                } else {
                                                      if ((($dateRange1 == "%") && (dateRange2 != "%")) || (($dateRange1 != "%") && ($dateRange2 == "%"))) {
                                                            header("location:newspaperindex.asp?Key=".$strSearch."&SearchDel=".$strPhrase."&txtDate1=".$dateSearch1."&txtDate2=".$dateSearch2."&RangeDate1=".$dateRange1."&RangeDate2=".$dateRange2."&OrderSort=".$strSortOrder."&SortByType=".$strOrderType."&errorlevel=1");
                                                      } else {
                                                            $StrSql = $StrSql."AND (Item_Date BETWEEN #".str_ireplace("'", "''", $strDateRange1)."# AND #".str_ireplace("'", "''", $strDateRange2)."#)";
                                                      }
                                                }
                                          $StrSql = $StrSql."Order BY ".$strFstOrder." ".$strSortOrder.", ".$strSndOrder.";";
                                    } else {
                                          $StrSql = $StrSql."Select * ";
                                          $StrSql = $StrSql."From newspaperindex ";
                                          $StrSql = $StrSql."Where ";
                                          $StrSql = $StrSql."(Keywords LIKE '% ".$strNewSearch[0]." %' OR Keywords LIKE '".$strNewSearch[0]." %' OR Keywords LIKE '% ".$strNewSearch[0]."' OR Keywords LIKE '".$strNewSearch[0]."' OR Context LIKE '% ".$strNewSearch[0]." %' OR Context LIKE '".$strNewSearch[0]." %' OR Context LIKE '% ".$strNewSearch[0]."' OR Context LIKE '".$strNewSearch[0]."')";
                                                if (($dateRange1 == "%") && ($dateRange2 == "%")) {
                                                      $StrSql = $StrSql."AND (Item_Date LIKE '%".str_ireplace("'", "''", $strDateSearch)."%')";
                                                } else {
                                                      if ((($dateRange1 == "%") && ($dateRange2 != "%")) || (($dateRange1 != "%") && ($dateRange2 == "%"))) {
                                                            header("location:newspaperindex.asp?Key=".$strSearch."&SearchDel=".$strPhrase."&txtDate1=".$dateSearch1."&txtDate2=".$dateSearch2."&RangeDate1=".$dateRange1."&RangeDate2=".$dateRange2."&OrderSort=".$strSortOrder."&SortByType=".$strOrderType."&errorlevel=1");
                                                      } else {
                                                            $StrSql = $StrSql."AND (Item_Date BETWEEN #".str_ireplace("'", "''", $strDateRange1)."# AND #".str_ireplace("'", "''", $strDateRange2)."#)";
                                                      }
                                                }
                                          $StrSql = $StrSql."Order BY ".$strFstOrder." ".$strSortOrder.", ".$strSndOrder.";";
                                    }
                              }
            
                        $rstSeach = new COM('ADODB.RecordSet');
                        $rstSearch->PageSize=$PAGE_SIZE;
                        $rstSearch->CacheSize=$PAGE_SIZE;
                        $rstSeach->ActiveConnection = $cnnsearch;
                        $rstSeach->LockType = adLockReadOnly;
                        $rstSeach->CursorLocation = 3;
                        $rstSeach->CursorType = adOpenStatic;
                        $rstSeach->Open($cnnsearch, $StrSql);
                        $iRecordCount = $rstSearch->RecordCount();
                        $iPageCount = $rstSearch->PageCount();
                        
                        //$rstSearch = odbc_exec($cnnsearch, $StrSql);
                        //$iRecordCount = odbc_num_rows($rstSearch);
                                                
                        if ($iRecordCount == 0) {
                              ?>
                              <P>
                              <STRONG>No results found for <EM><?=$strResult?></EM>.  Please try again.</STRONG>
                              </P>
                              <BR>
                              <INPUT TYPE="button" onClick="location.href='newspaperindex.php?key=<?=urlencode($strKey)?>&txtdate1=<?=$dateSearch1?>&txtdate2=<?=$dateSearch2?>&SearchDel=<?=$strPhrase?>&RangeDate1=<?=$dateRange1?>&RangeDate2=<?=$dateRange2?>&OrderSort=<?=$strSortOrder?>&SortByType=<?=$strOrderType?>'" NAME="Back" VALUE="New Search">
                              <?php
                        } else {
                              $rstSearch->AbsolutePage($iPageCurrent);
                              ?>
                              <DIV ALIGN="left">
                              <STRONG><?=$iRecordCount?> results found
                                    <?php if ($strResult != "*") { ?>
                                          for: <EM><?=$strResult?></EM>
                                    <?php } ?>
                                    <?php if (($dateSearch1 != "%") || ($dateSearch2 != "%")) { ?>
                                          for date: <EM>
                                                <?php if ($dateSearch1 != "%") { ?>
                                                      <?=$dateSearch1?>
                                                <?php } ?>
                                          MM
                                    <?php } ?>/
                                    <?php if ($dateSearch2 != "%") { ?>
                                          <?=$dateSearch2?>
                                    <?php } else { ?>
                                          YYYY
                                    <?php } ?></EM>
                                    <?php if (($dateRange1 != "%") || ($dateRange2 != "%")) { ?>
                                          to date: <EM>
                                          <?php if ($dateRange1 != "%") { ?>
                                                <?=$dateRange1?>
                                          <?php } else { ?>
                                                MM
                                          <?php } ?>/
                                    <? if ($dateRange2 != "%") { ?>
                                          <?=$dateRange2?>
                                    <?php } else { ?>
                                          YYYY
                                    <?php } ?>
                              <?php } ?></EM>
                        <?php } ?>
                        </STRONG>
                        </DIV>
                        <DIV ALIGN="right">
                        <STRONG>
                        Displaying page <?=$iPageCurrent?>
                        of <?=$iPageCount?>:
                        </STRONG>
                        </DIV>
                        <P ALIGN="right">
                        <?

                        if ($iPageCount <= 11) {
                              if ($iPageCurrent > 11) {
                                    ?>
                                    <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=1">First Page</A>
                                    <?
                              }
                        } else {
                              if ($iPageCurrent > 5) {
                                    ?>
                                    <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=1">First Page</A>
                                    <?
                              }
                        }
                        echo("&nbsp;&nbsp;");
            
                        if ($iPageCurrent > 11) {
                              ?>
                              <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$iPageCurrent - 10?>">&lt;</A>
                              <?
                        }

                        if ($iPageCount <= 11) {
                              for ($I = 1; $I<=$iPageCount; $I++) {
                                    if ($I = $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        } else {
//I##########
                              if ($iPageCurrent == 1) {
                                    for ($I = $iPageCurrent; $I<=$iPageCurrent + 10; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//#I########
                              if ($iPageCurrent == 2) {
                                    for ($I = $iPageCurrent - 1; $I<=$iPageCurrent + 9; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//##I########
                              if ($iPageCurrent == 3) {
                                    for ($I = $iPageCurrent - 2; $I<=$iPageCurrent + 8; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//###I#######
                              if ($iPageCurrent == 4) {
                                    for ($I = $iPageCurrent - 3; $I<=$iPageCurrent + 7; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//####I######
                              if ($iPageCurrent == 5) {
                                    for ($I = $iPageCurrent - 4; $I<=$iPageCurrent + 6; $I++) {
                                          if ($I = $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//#####I#####
                              if (($iPageCurrent >= 6) && ($iPageCurrent < $iPageCount - 4)) {
                                    for ($I = $iPageCurrent - 5; $I<=$iPageCurrent + 5; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//######I####
                              if ($iPageCurrent == $iPageCount - 4) {
                                    for ($I = $iPageCurrent - 6; $I<=$iPageCurrent + 4; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//#######I###
                              if ($iPageCurrent == $iPageCount - 3) {
                                    for ($I = $iPageCurrent - 7; $I<=$iPageCurrent + 3; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//########I##
                              if ($iPageCurrent == $iPageCount - 2) {
                                    for ($I = $iPageCurrent - 8; $I<=$iPageCurrent + 2; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//#########I#
                              if ($iPageCurrent == $iPageCount - 1) {
                                    for ($I = $iPageCurrent - 9; $I<=$iPageCurrent + 1; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
//##########I
                              if ($iPageCurrent == $iPageCount) {
                                    for ($I = $iPageCurrent - 10; $I<=$iPageCurrent; $I++) {
                                          if ($I == $iPageCurrent) {
                                                ?>
                                                <?=$I?>
                                                <?
                                          } else {
                                                ?>
                                                <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                                <?
                                          }
                                    }
                              }
                        }

                        if ($iPageCurrent < $iPageCount - 10) {
                              ?>
                              <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$iPageCurrent + 10?>">&gt;</A>
                              <?
                        }
                        echo("&nbsp;&nbsp;");
      
                        if ($iPageCount <= 11) {
                              if ($iPageCurrent < $iPageCount - 10) {
                                    ?>
                                    <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$iPageCount?>">Last Page</A>
                                    <?
                              }
                        } else {
                              if ($iPageCurrent < $iPageCount - 5) {
                                    ?>
                                    <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$iPageCount?>">Last Page</A>
                                    <?
                              }
                        }
                        ?>
                        </P>
                        <?php //echo($rstSearch->AbsolutePage()) ?>
                        <INPUT TYPE="button" onClick="location.href='newspaperindex.php?key=<?=urlencode($strKey)?>&txtdate1=<?=$dateSearch1?>&txtdate2=<?=$dateSearch2?>&SearchDel=<?=$strPhrase?>&RangeDate1=<?=$dateRange1?>&RangeDate2=<?=$dateRange2?>&OrderSort=<?=$strSortOrder?>&SortByType=<?=$strOrderType?>'" NAME="Back" VALUE="New Search">
                              <TABLE BORDER="1" WIDTH="100?" BGCOLOR="#ffffE8">
                                    <TR>
                                    <FONT COLOR="#FFFFFF">
                                          <TH ALIGN="left" BGCOLOR="#008080">Keywords</TH>
                                          <TH ALIGN="left" BGCOLOR="#008080">Newspaper</TH>
                                          <TH ALIGN="left" BGCOLOR="#008080">Section</TH>
                                          <TH ALIGN="left" BGCOLOR="#008080">Page</TH>
                                          <TH ALIGN="center" BGCOLOR="#008080">Date<BR>
                                          mm/dd/yy</TH>
                                          <TH ALIGN="left" BGCOLOR="#008080">Photo</TH>
                                    </FONT>
                                    </TR>
                                    <?php
                                    do {
                                          echo("<tr>");
                                                echo("<td>");
                                                //            echo(rstsearch("Context"));
                                                echo("</td>");
                                                echo("<td>");
                                                //            echo(rstsearch("Newspaper"));
                                                echo("</td>");
                                                echo("<td>");
                                                //            echo(rstsearch("Section"));
                                                echo("</td>");
                                                echo("<td>");
                                                //            echo(rstsearch("Page"));
                                                echo("</td>");
                                                echo("<td>");
                                                //      If (isnull(rstsearch("Item_Date"))) or (rstsearch("Item_Date") = "") Then;
                                                //      echo("Date Unavailable");
                                                //      else
                                                //      echo(rstsearch("Item_Date"));
                                                //      end if
                                                echo("</td>");
                                                echo("<td>");
                                                //            echo(rstsearch("Photo"));
                                                echo("</td>");
                                          echo("</tr>");
                                          $rstsearch->MoveNext();
                                    }
                                    while (!$rstSearch->EOF && $rstSearch->AbsolutePage() == $iPageCurrent);
                                    ?>
                              </TABLE>
                  <INPUT TYPE="button" onClick="location.href='newspaperindex.php?key=<?=urlencode($strKey)?>&txtdate1=<?=$dateSearch1?>&txtdate2=<?=$dateSearch2?>&SearchDel=<?=$strPhrase?>&RangeDate1=<?=$dateRange1?>&RangeDate2=<?=$dateRange2?>&OrderSort=<?=$strSortOrder?>&SortByType=<?=$strOrderType?>'" NAME="Back" VALUE="New Search">
                  <DIV ALIGN="left">
                  <STRONG><?=$iRecordCount?> results found

                  <?php if ($strResult != "*") { ?>
                        for: <EM><?=$strResult?></EM>
                  <?php } ?>
            
                  <?php if (($dateSearch1 != "%") || ($dateSearch2 != "%")) { ?>
                        for date: <EM>
                              <?php if ($dateSearch1 != "%") { ?>
                                    <?=$dateSearch1?>
                              <?php } ?>
                        MM
                  <?php } ?>/<?php

                  if ($dateSearch2 != "%") { ?>
                        <?=$dateSearch2?>
                  <?php } else { ?>
                        YYYY
                  <?php } ?></EM>
      
                  <?php if (($dateRange1 != "%") || ($dateRange2 != "%")) { ?>
                        to date: <EM>
                        <?php if ($dateRange1 != "%") { ?>
                              <?=$dateRange1?>
                        <?php } else { ?>
                              MM
                        <?php } ?>/<?
                        
                        if ($dateRange2 != "%") { ?>
                              <?=$dateRange2?>
                        <?php } else { ?>
                              YYYY
                        <?php } ?>
                  <?php } ?></EM>
                  </STRONG>
                  </DIV>
                  <DIV ALIGN="right">
                  <STRONG>
                  Displaying page <?=$iPageCurrent?>
                  of <?=$iPageCount?>:
                  </STRONG>
                  </DIV>
                  <P ALIGN="right">
                  <?
                  if ($iPageCount <= 11) {
                        if ($iPageCurrent > 11) {
                              ?>
                              <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=1">First Page</A>
                              <?
                        }
                  } else {
                        if ($iPageCurrent > 5) {
                              ?>
                              <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=1">First Page</A>
                              <?
                        }
                  }
                  echo("&nbsp;&nbsp;");
                  if ($iPageCurrent > 11) {
                        ?>
                        <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$iPageCurrent - 10?>">&lt;</A>
                        <?
                  }
                  if ($iPageCount <= 11) {
                        for ($I = 1; $I<=$iPageCount; $I++) {
                              if ($I = $iPageCurrent) {
                                    ?>
                                    <?=$I?>
                                    <?
                              } else {
                                    ?>
                                    <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                    <?
                              }
                        }
                  } else {
//I##########
                        if ($iPageCurrent == 1) {
                              for ($I = $iPageCurrent; $I<=$iPageCurrent + 10; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//#I########
                        if ($iPageCurrent == 2) {
                              for ($I = $iPageCurrent - 1; $I<=$iPageCurrent + 9; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//##I########
                        if ($iPageCurrent == 3) {
                              for ($I = $iPageCurrent - 2; $I<=$iPageCurrent + 8; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//###I#######
                        if ($iPageCurrent == 4) {
                              for ($I = $iPageCurrent - 3; $I<=$iPageCurrent + 7; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//####I######
                        if ($iPageCurrent == 5) {
                              for ($I = $iPageCurrent - 4; $I<=$iPageCurrent + 6; $I++) {
                                    if ($I = $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//#####I#####
                        if (($iPageCurrent >= 6) && ($iPageCurrent < $iPageCount - 4)) {
                              for ($I = $iPageCurrent - 5; $I<=$iPageCurrent + 5; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//######I####
                        if ($iPageCurrent == $iPageCount - 4) {
                              for ($I = $iPageCurrent - 6; $I<=$iPageCurrent + 4; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//#######I###
                        if ($iPageCurrent == $iPageCount - 3) {
                              for ($I = $iPageCurrent - 7; $I<=$iPageCurrent + 3; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//########I##
                        if ($iPageCurrent == $iPageCount - 2) {
                              for ($I = $iPageCurrent - 8; $I<=$iPageCurrent + 2; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//#########I#
                        if ($iPageCurrent == $iPageCount - 1) {
                              for ($I = $iPageCurrent - 9; $I<=$iPageCurrent + 1; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
//##########I
                        if ($iPageCurrent == $iPageCount) {
                              for ($I = $iPageCurrent - 10; $I<=$iPageCurrent; $I++) {
                                    if ($I == $iPageCurrent) {
                                          ?>
                                          <?=$I?>
                                          <?
                                    } else {
                                          ?>
                                          <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$I?>"><?=$I?></A>
                                          <?
                                    }
                              }
                        }
                  
                        if ($iPageCurrent < $iPageCount - 10) {
                              ?>
                              <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$iPageCurrent + 10?>">&gt;</A>
                              <?
                        }
                        echo("&nbsp;&nbsp;");
                        if ($iPageCount <= 11) {
                              if ($iPageCurrent < $iPageCount - 10) {
                                    ?>
                                    <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$iPageCount?>">Last Page</A>
                                    <?
                              }
                        } else {
                              if ($iPageCurrent < $iPageCount - 5) {
                                    ?>
                                    <A HREF="<?=$strURL?>?Key=<?=urlencode($strKey)?>&SearchDel=<?=urlencode($strPhrase)?>&txtDate1=<?=urlencode($dateSearch1)?>&txtDate2=<?=urlencode($dateSearch2)?>&RangeDate1=<?=urlencode($dateRange1)?>&RangeDate2=<?=urlencode($dateRange2)?>&OrderSort=<?=urlencode($strSortOrder)?>&SortByType=<?=urlencode($strOrderType)?>&page=<?=$iPageCount?>">Last Page</A>
                                    <?
                              }
                        }
                  }
            }
            ?>
            </P>
            <?php
            $rstsearch->close();
            $cnnsearch->close();
            
            } else {
                  header("location:newspaperindex.asp?Key=".strKey."&SearchDel=".strPhrase."&txtDate1=".dateSearch1."&txtDate2=".dateSearch2."&RangeDate1=".dateRange1."&RangeDate2=".dateRange2."&OrderSort=".strSortOrder."&SortByType=".strOrderType."&errorlevel=2");
            }
            ?>
      </BODY>
</HTML>

Here is my "FATAL ERROR",

Fatal error: Uncaught exception 'com_exception' with message '<b>Source:</b> ADODB.Recordset<br/><b>Description:</b> Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.' in D:\Intranet\Newspaperindex\PHP\npisearchtesting.php:310 Stack trace: #0 D:\Intranet\Newspaperindex\PHP\npisearchtesting.php(310): com->Open(Object(com), 'Select * From n...') #1 {main} thrown in D:\Intranet\Newspaperindex\PHP\npisearchtesting.php on line 310

This is line 310 in case you wondered, and I figured it may help.

310      $rstSeach->Open($cnnsearch, $StrSql);
0
 
Richard QuadlingSenior Software DeverloperCommented:
And what is the parameter sequence for the Open method?

Do you have a typelib analyser?

http://itripoli.com

This will give you the parameters, their types and the sequence.

NOTE: You cannot use named parameters and they have to be in sequence.

If you need an empty parameter you will need to use the Variant type. See my note on the VARIANT at http://www.php.net/manual/en/class.variant.php

or ...

With thanks to Harald Radi and Wez Furlong.
Some VBA functions have optional parameters. Sometimes the parameters you want to pass are not consecutive.
e.g.
GoTo What:=wdGoToBookmark, Name="BookMarkName"
GoTo(wdGoToBookmark,,,"BookMarkName)
In PHP, the "blank" parameters need to be empty.
Which is ...
<?php
// Some servers may have an auto timeout, so take as long as you want.
set_time_limit(0);
// Show all errors, warnings and notices whilst developing.
error_reporting(E_ALL);
// Used as a placeholder in certain COM functions where no parameter is required.
$empty = new VARIANT();
// Load the appropriate type library.
com_load_typelib('Word.Application');
// Create an object to use.
$word = new COM('word.application') or die('Unable to load Word');
print "Loaded Word, version {$word->Version}\n";
// Open a new document with bookmarks of YourName and YourAge.
$word->Documents->Open('C:/Unfilled.DOC');
// Fill in the information from the form.
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // Note use of wdGoToBookmark, from the typelibrary and the use of $empty.
$word->Selection->TypeText($_GET['YourName']);
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourAge');
$word->Selection->TypeText($_GET['YourAge']);
// Save it, close word and finish.
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc");
$word->Quit();
$word->Release();
$word = null;
print "Word closed.\n";
?>
The example document is ...
Hello [Bookmark of YourName], you are [Bookmark of YourAge] years old.
and it would be called ...
word.php?YourName=Richard%20Quadling&YourAge=35
Regards,
Richard.

0
 
nplibAuthor Commented:
EGAD!
I don't quite see the connection between where we were going with this and your, to me, slightley bezare answer.
Like durr man. I understand what you said, somehow. But I don't see the connection.
0
 
Richard QuadlingSenior Software DeverloperCommented:
Sorry.

That was sort of cryptic.

Also.

Sorry for not replying earlier. I was blacklisted by EE. No idea why!

0
 
Richard QuadlingSenior Software DeverloperCommented:
A few things.

1 - Whilst testing/developing, ALWAYS have ...

<?php
error_reporting(E_ALL);
?>

EVERYTHING that is not 100% right is wrong - Errors, Warnings and Notices. All give you pointers to what's going wrong.

2 - If you have used COM from within a MS VB environment (VBA, VBS, etc), you will be familiar with ...

Named parameters e.g.
some_object.some_method some_param:=some_value, another_param:=another_value

or skipped parameters e.g.
some_object.some_method(some_value,,another_value)


Neither of these techniques are supported by PHP

Instead you need to provide all parametes upto the last one you want. Those that are missing you need to supply an an empty VARIANT type.

e.g.

$some_object->some_method($some_value, new VARIANT(), $another_value);


So.

The COM server provides its public connectivity via a typelibrary. These type librarys are constructed in such a way that many languages can read them and determine how to make the calls to the COM server. We used to have to use a compiler and use header files to libraries. Type libraries are no more than that but done in a more secure fashion.

So.

Knowing the EXACT format of the calls (the return types, the parameter types, constants etc) is really useful to take full advantage of the library. Normally this information is available with the full blown development studio. But, if you don't have the proper documentation, all you actually need is a type library reader. Remember, EVERYTHING you need to know about the COM server is in the type library. The type library is the only gateway to the com server, so a type library reader will provide all you need to know.

So.

By using a typelib reader, you can see EXACTLY the structure of the calls, the objects returned, etc and then code correctly for the library.



All this is to make sure you are issuing the calls with all the data you can to make your code work.

0
 
Richard QuadlingSenior Software DeverloperCommented:
Did I help?
0
 
nplibAuthor Commented:
It did help, however I still get this error,
Fatal error: Uncaught exception 'com_exception' with message '<b>Source:</b> ADODB.Recordset<br/><b>Description:</b> Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.' in D:\Intranet\Newspaperindex\PHP\npisearchtesting.php:312 Stack trace: #0 D:\Intranet\Newspaperindex\PHP\npisearchtesting.php(312): com->Open(Object(com), 'Select * From n...') #1 {main} thrown in D:\Intranet\Newspaperindex\PHP\npisearchtesting.php on line 312
but I guess I can't do it the way I did it in ASP with ADO, so I came to the conclusion that I would need to rewrite my code using a different method to get DB paging with PHP and Access.
0
 
Richard QuadlingSenior Software DeverloperCommented:
The SQL Statement may be the issue. You may need to cast the types going into the function as they are expected to be of the correct type.

I don't know if PHP looks at the typelibrary to convert its loosely typed variables into typed variables.

What is line 312 of npisearchtesting.php (+/- 10 lines).
0
 
nplibAuthor Commented:
$rstSeach->Open($cnnsearch, $StrSql);
I know the SQL statement works, because if I copy and paste it into Access it gives me the results.
0
 
Richard QuadlingSenior Software DeverloperCommented:
And what are the parameters required for Open().
0
 
nplibAuthor Commented:
adOpenStatic, adLockReadOnly, adCmdText
0
 
Richard QuadlingSenior Software DeverloperCommented:
There are several question here, please answer all of them.

1 - What types are expected for these parameters?

You are supplying $cnnsearch as the first parameter.

I don't think that is correct.

As the COM interface is maintaining the connection as part of $rstSearch ( $rstSeach->ActiveConnection = $cnnsearch; )



2 - Which of these parameters are optional?

As I said earlier, you HAVE to supply the parameters in the correct order. No gaps! No named parameters.


3 - Without wanting to sound rude, where did you get the code that requires the connection object as the first parameter of the Open method? You may be looking at the completely wrong set of documentation.

The TypeLib viewer I recommended will give your THE correct mechanism.


4 - Is the order of the parameters you've provided correct? I would suspect that the CmdText would be first (and mandatory) and then followed by the optional OpenStatic and LockReadOnly, but that would be down to the programmer of the COM interface.


Say the order is my suggestion.

You can ...

$rstSearch->Open($StrSQL);

as you do not need to supply trailing optional parameters.

NOTE 1: Optional parameters are normally at the end of the list of parameters.
NOTE 2: TRAILING is important. If, say, you wanted to supply mandatory parameter 1 and optional parameter 3, you MUST supply optional parameter 2 (for ANY COM METHOD ---- NOT JUST THIS EXAMPLE!!!!) - e.g. $com_object->Method($mandatory_param1, new Variant(), $optional_param3);



0
 
nplibAuthor Commented:
My answers are preceeded by a dash (-)

There are several question here, please answer all of them.

1 - What types are expected for these parameters?

You are supplying $cnnsearch as the first parameter.

I don't think that is correct.

As the COM interface is maintaining the connection as part of $rstSearch ( $rstSeach->ActiveConnection = $cnnsearch; )

- As I said before I am new to this PHP, So I'm no entirely sure what you mean.
  I just know in asp in order to do paging the with ado, once rs = server.createobject("ADODB.Recordset") as been done, I have to rs.open sql, conn, adOpenStatic, adLockReadOnly, adCmdText
  Thats as much as I know there. I understand what they are doing.

2 - Which of these parameters are optional?

As I said earlier, you HAVE to supply the parameters in the correct order. No gaps! No named parameters.

- none optional

3 - Without wanting to sound rude, where did you get the code that requires the connection object as the first parameter of the Open method? You may be looking at the completely wrong set of documentation.

The TypeLib viewer I recommended will give your THE correct mechanism.
- I couldn't figure out the TypeLib viewer, or at least what it was supposed to do for me.

4 - Is the order of the parameters you've provided correct? I would suspect that the CmdText would be first (and mandatory) and then followed by the optional OpenStatic and LockReadOnly, but that would be down to the programmer of the COM interface.

- in asp it has to be in this order adOpenStatic, adLockReadOnly, adCmdText so I would assume that it would be the same in PHP.
  however I couldn't figure out how to set adOpenStatic in PHP
Say the order is my suggestion.

You can ...

$rstSearch->Open($StrSQL);

as you do not need to supply trailing optional parameters.

NOTE 1: Optional parameters are normally at the end of the list of parameters.
NOTE 2: TRAILING is important. If, say, you wanted to supply mandatory parameter 1 and optional parameter 3, you MUST supply optional parameter 2 (for ANY COM METHOD ---- NOT JUST THIS EXAMPLE!!!!) - e.g. $com_object->Method($mandatory_param1, new Variant(), $optional_param3);

I tried setting it to this instead
$rstSearch->Open($StrSQL);

now I don't get the error I was getting I get this error.

Fatal error: Call to undefined method stdClass::RecordCount() in D:\Intranet\Newspaperindex\PHP\npisearchtesting.php on line 313
which is this line
$iRecordCount = $rstSearch->RecordCount();
I figure this line will also error once the one above it is fixed. How should I fix these. Also if you know how I can set the adCmdText                    
$iPageCount = $rstSearch->PageCount();
0
 
Richard QuadlingSenior Software DeverloperCommented:
According to the Type Lib I have

Name: ADODB
File: C:\Program Files\Common Files\System\ADO\MSADO15.dll
Version: 2.8

The Recordset is a member of ADODB.Recordset

The open method for the recordset object allows you to include all the parameters. You do not need to address each one individually.


Sub Open (ByVal  Source, ByVal  ActiveConnection, [ByVal  CursorType As CursorTypeEnum = adOpenUnspecified], [ByVal  LockType As LockTypeEnum = adLockUnspecified], [ByVal  Options As Long-1])


According to this, you need to supply Source and ActiveConeection. These are mandatory to the Open method.


If you use the TypeLib explorer software, open the file I said above.

In the left hand "TypeInfos:" pane, look for RecordSet.

In the right hand "Members:" pane, look for Open.




PageCount and RecordCount are NOT functions!!! They are properties ...
(Read-Only)  Property RecordCount As Long
(Read-Only)  Property PageCount As Long

$l_RecordCount = $rstSearch->RecordCount;
$l_PageCount = $rstSearch->PageCount;

should be adequate.

0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 14
  • 10
Tackle projects and never again get stuck behind a technical roadblock.
Join Now