Jag fick en riktig utmaning när jag försökte återskapa en gammal websida på nytt, som skulle baseras på PHP och en IIS-anslutning. Servern var i princip identisk med den gamla som kördes på en Windows 2003-maskin, så när som på en liten detalj: På den gamla servern accepterade SQL-servern anrop via mssql_connect. På den nya servern vägrade den detta, av hittills totalt okänd anledning. Det här gjorde mig naturligtvis upprörd, eftersom jag mer eller mindre började känna av en egen deadline komma närmare. Problemet har gäckat mig i flera veckor och basen har sedan sist varit MSSQL Express 2005, som ju fungerade perfekt.
Häromdagen fick jag ett samtal. Flera databaser hade nu flyttats över till den nya webservern och med viss stolthet förklarades att ASP-anropen minsann fungerade klockrent. Inga problem, osv. Det gjorde mig ännu mer frustrerad, varför vägrar plötsligt MSSQL att ta emot samtal från PHP? Den som det visste. ASP-anropen inspirerade mig dock. Detta kanske kunde användas på något bra sätt genom PHP-koden. Och visst är det så, som alltid! Så jag började bygga upp nya anrop som baserades på den ”nya” lösningen, med NO-DSN. För säkerhetsskull lät jag dock det gamla stödet finnas kvar!
if (!$this->ado)
{
if (!$port)
{
$this->tdb = mssql_connect($server, $user, $pass) or $fail = true;
}
else
{
$this->tdb = mssql_connect("$server:$port", $user, $pass) or $fail = true;
}
}
// Fallback!
if ($fail || $this->ado)
{
$conn = new COM ("ADODB.Connection") or die("Cannot start ADO");
$this->tdb->conn = $conn; // Fake this
/* We don't want to use the integrated stuff here, so skip it. */
//Integrated Security=SSPI;
$connStr = "Provider=SQLOLEDB.1;UID=" . $user . ";PWD=" . $pass . ";Persist Security Info=False;DATABASE=X;Initial Catalog=X;SERVER=X;Data Source=X";
$this->tdb->conn->open($connStr); //Open the connection to the database
}
Den här lilla lösningen kräver förstås att man gör ytterligare modifikationer i query-anropen, eftersom de skiljer sig en aning åt, trots att det är samma plattform vi pratar med. Eftersom vi dessutom vill ha ut alla frågor som en array i formatet $array[columnname] = $value, så får speciella funktionsanrop ta hand om utdatat.
// Query
$tSQL = $this->tdb->conn->execute($query);
$returnthis = $this->fetch($tSQL);
[...]
// Funktion
if (!$this->tdb->conn)
{
return mssql_fetch_array($Array);
}
else
{
// More data to get?
if (!$Array->EOF)
{
$num_columns = $Array->Fields->Count();
for ($i=0; $i < $num_columns; $i++)
{
$nme = $Array->Fields($i)->name;
$fld[$nme] = $Array->Fields($i)->value;
}
// Movenext should be here, not in the programmers area.
$Array->MoveNext();
}
return $fld;
}
Och därmed, så har vi piskat upp Microsofts bedrövligt självinkompatibla system IGEN! Troligtvis kommer jag inom kort för TorneEngines räkning se till att källkoden ovan inkluderas för att stödja både PHP-mssql-built-in-calls, PHP-mssql-odbc, PHP-mssql-ado-nodsn samt faktiskt även PHP-db2-odbc ala Movex-språk. The more the better…
Läs även andra bloggares åsikter om ASP, db2, dsn, IIS, mssql, nodsn, odbc, php




